# Formatting chunk

# Clear workspace
rm(list = ls())

# Specify libraries

library(tidyverse)
library(lubridate)
library(naniar)

# Read data from web
cameroon_read <- read_csv(url("https://datashare.ed.ac.uk/bitstream/handle/10283/3804/Heat-Covid%20Nexus%20Survey_Cameroon.csv?sequence=1&isAllowed=y"), n_max = 2000)
indonesia_read <- read_csv(url("https://datashare.ed.ac.uk/bitstream/handle/10283/3804/Heat-Covid%20Nexus%20Survey_Indonesia.csv?sequence=2&isAllowed=y"), n_max = 2000)
pakistan_read <- read_csv(url("https://datashare.ed.ac.uk/bitstream/handle/10283/3804/Heat-Covid%20Nexus%20Survey_Pakistan.csv?sequence=14&isAllowed=y"), n_max = 2000)
india_read <- read_csv(url("https://datashare.ed.ac.uk/bitstream/handle/10283/3804/Heat-Covid%20Nexus%20Survey_India.csv?sequence=15&isAllowed=y"), n_max = 2000)


# Crop objects
pakistan_cropped <- pakistan_read %>% filter(Country == "Pakistan")


india_cropped <- india_read %>% filter(Country == "India")


# Generate R-legible names
names(cameroon_read) <- str_replace_all(names(cameroon_read), c(" " = "_", 
                                                                "/" = "_or_",
                                                                "'" = ""))
names(indonesia_read) <- str_replace_all(names(indonesia_read), c(" " = "_", 
                                                                  "/" = "_or_",
                                                                  "'" = ""))
names(pakistan_cropped) <- str_replace_all(names(pakistan_cropped), c(" " = "_", 
                                                                      "/" = "_or_",
                                                                      "'" = ""))
names(india_cropped) <- str_replace_all(names(india_cropped), c(" " = "_", 
                                                                "/" = "_or_",
                                                                "'" = ""))

# Tidy objects
cameroon_factors <- c("Country", "Language", "Agree", "Littoral", "Gender", "Occupation", "Occupation_Translated", "Occupation_Coded", 
                      "OwnHouse", "CoolHome", "Electricity", "DrinkingWater", "HouseholdPurposes", "RoofingMaterial", "WallMaterial", 
                      "FloorMaterial", "Windows", "NormallyDo", "NormallyDo_Translated", "NormallyDo_Coded", "Add_ventilation", 
                      "Cant_go_outside_(COVID_related)", "Clean_floor_with_water", "Do_nothing_specific", "Draw_curtains", 
                      "Drink_cold_drink", "Drink_warm_drink", "Drink_water", "Go_outside", "Sit_under_tree", "Sleep_outside", 
                      "Sleep_or_lie_on_floor", "Sleep_or_rest", "Smoke", "Stay_at_home", "Take_a_bath_or_shower", "Turn_off_lights", 
                      "Turn_on_power_source", "Unclear", "Undress_or_change_clothes_or_wet_clothes", "Use_a_cooler", "Use_AC", "Use_fan", 
                      "Use_manual_fan_or_cooling_device", "Use_talcum_powder", "PandemicChange", "YesPandemicChange", 
                      "YesPandemicChange_Translated", "YesPandemicChange_Recoded", "SpendAtHome", "AmountOfTime", "Income", 
                      "EatingHabits", "WaterIntake", "ElectricityUsage", "HealthServices", "HomeWarm", "TemperatureInsideHome", 
                      "TemperatureOutsideHome", "Experience_Blurred_vision", "Experience_Clammy_skin", "Experience_Concentration_loss", 
                      "Experience_Confusion", "Experience_Convulsions", "Experience_Dizziness", "Experience_DONT_KNOW", 
                      "Experience_Fainting_[brief_loss_of_consciousness]", "Experience_Fatigue", "Experience_Feeling_hot", 
                      "Experience_Feeling_listless_or_lack_of_engagement_with_social_activities_or_family", "Experience_Feeling_sweaty", 
                      "Experience_Feeling_thirsty", "Experience_Headache", "Experience_Irrational_behaviour", 
                      "Experience_Loss_of_consciousness_[extensive]", "Experience_Muscle_cramps", "Experience_Muscle_weakness", 
                      "Experience_Nausea", "Experience_Poor_quality_of_sleep", "Experience_Rash", "Experience_REFUSED", 
                      "Experience_Vomiting", "ExperienceBeforeHeat", "ExperienceBeforeHeat_(Blurred_vision)", 
                      "ExperienceBeforeHeat_(Clammy_skin)", "ExperienceBeforeHeat_(Concentration_loss)", "ExperienceBeforeHeat_(Confusion)", 
                      "ExperienceBeforeHeat_(Convulsions)", "ExperienceBeforeHeat_(Dizziness)", 
                      "ExperienceBeforeHeat_(Fainting_[brief_loss_of_consciousness])", "ExperienceBeforeHeat_(Fatigue)", 
                      "ExperienceBeforeHeat_(Feeling_hot)", 
                      "ExperienceBeforeHeat_(Feeling_listless_or_lack_of_engagement_with_social_activities_or_family)", 
                      "ExperienceBeforeHeat_(Feeling_sweaty)", "ExperienceBeforeHeat_(Feeling_thirsty)", "ExperienceBeforeHeat_(Headache)", 
                      "ExperienceBeforeHeat_(Irrational_behaviour)", "ExperienceBeforeHeat_(Loss_of_consciousness_[extensive])", 
                      "ExperienceBeforeHeat_(Muscle_cramps)", "ExperienceBeforeHeat_(Muscle_weakness)", "ExperienceBeforeHeat_(Nausea)", 
                      "ExperienceBeforeHeat_(Poor_quality_of_sleep)", "ExperienceBeforeHeat_(Rash)", "ExperienceBeforeHeat_(Vomiting)", 
                      "FeelingMore", "PhysicalConflict", "HeatAffect")

cameroon_tidy <- cameroon_read %>% mutate_at(cameroon_factors, factor) %>% rename(Region = Littoral)

indonesia_factors <- c("Country", "Agree", "ADM-1", "Gender", "Occupation", "Occupation_Translated", "Occupation_Coded", "OwnHouse", 
                       "CoolHome", "Electricity",  "DrinkingWater", "HouseholdPurposes", "RoofingMaterial", "WallMaterial", "FloorMaterial", 
                       "Windows", "NormallyDo", "NormallyDo_Translated", "NormallyDo_Coded", "Add_ventilation", 
                       "Cant_go_outside_(COVID_related)", "Clean_floor_with_water", "Do_nothing_specific", "Draw_curtains", 
                       "Drink_cold_drink", "Drink_warm_drink", "Drink_water", "Go_outside", "Sit_under_tree", "Sleep_outside", 
                       "Sleep_or_lie_on_floor", "Sleep_or_rest", "Smoke", "Stay_at_home", "Take_a_bath_or_shower", "Turn_off_lights", 
                       "Turn_on_power_source", "Unclear", "Undress_or_change_clothes_or_wet_clothes", "Use_a_cooler", "Use_AC", "Use_fan", 
                       "Use_manual_fan_or_cooling_device", "Use_talcum_powder", "PandemicChange", "YesPandemicChange", 
                       "YesPandemicChange_Translated", "YesPandemicChange_CodedGeneral", "YesPandemicChange_CodedSpecific", 
                       "SpendAtHome", "AmountOfTime", "Income", "EatingHabits", "WaterIntake", "ElectricityUsage", "HealthServices", 
                       "HomeWarm", "TemperatureInsideHome", "TemperatureOutsideHome", "Experience_Blurred_vision", "Experience_Clammy_skin", 
                       "Experience_Concentration_loss", "Experience_Confusion", "Experience_Convulsions", "Experience_Dizziness", 
                       "Experience_DONT_KNOW", "Experience_Fainting_[brief_loss_of_consciousness]", "Experience_Fatigue", 
                       "Experience_Feeling_hot", "Experience_Feeling_listless_or_lack_of_engagement_with_social_activities_or_family", 
                       "Experience_Feeling_sweaty", "Experience_Feeling_thirsty", "Experience_Headache", "Experience_Irrational_behaviour", 
                       "Experience_Loss_of_consciousness_[extensive]", "Experience_Muscle_cramps", "Experience_Muscle_weakness", 
                       "Experience_Nausea", "Experience_Poor_quality_of_sleep", "Experience_Rash", "Experience_REFUSED", 
                       "Experience_Vomiting", "ExperienceBeforeHeat", "ExperienceBeforeHeat_(Blurred_vision)", 
                       "ExperienceBeforeHeat_(Clammy_skin)", "ExperienceBeforeHeat_(Concentration_loss)", "ExperienceBeforeHeat_(Confusion)", 
                       "ExperienceBeforeHeat_(Convulsions)", "ExperienceBeforeHeat_(Dizziness)", 
                       "ExperienceBeforeHeat_(Fainting_[brief_loss_of_consciousness])", "ExperienceBeforeHeat_(Fatigue)", 
                       "ExperienceBeforeHeat_(Feeling_hot)", 
                       "ExperienceBeforeHeat_(Feeling_listless_or_lack_of_engagement_with_social_activities_or_family)", 
                       "ExperienceBeforeHeat_(Feeling_sweaty)", "ExperienceBeforeHeat_(Feeling_thirsty)", 
                       "ExperienceBeforeHeat_(Headache)", "ExperienceBeforeHeat_(Irrational_behaviour)", 
                       "ExperienceBeforeHeat_(Loss_of_consciousness_[extensive])", "ExperienceBeforeHeat_(Muscle_cramps)", 
                       "ExperienceBeforeHeat_(Muscle_weakness)", "ExperienceBeforeHeat_(Nausea)", 
                       "ExperienceBeforeHeat_(Poor_quality_of_sleep)", "ExperienceBeforeHeat_(Rash)", 
                       "ExperienceBeforeHeat_(Vomiting)", "FeelingMore", "PhysicalConflict", "HeatAffect")

indonesia_tidy <- indonesia_read %>%  mutate_at(indonesia_factors, factor) %>% 
  select(1:114) %>%
  rename("YesPandemicChange_Recoded" = "YesPandemicChange_CodedSpecific") %>%
  select(-YesPandemicChange_CodedGeneral) %>%
  mutate("Language" = NA, .before = "Agree") %>%
  rename("Region" = "ADM-1")

pakistan_factors <- c("Country", "Agree", "Region", "Gender", "Occupation", "Occupation_Translated", "Occupation_Coded", "OwnHouse", 
                      "CoolHome", "Electricity",  "DrinkingWater", "HouseholdPurposes", "RoofingMaterial", "WallMaterial", "FloorMaterial", 
                      "Windows", "NormallyDo", "NormallyDo_Translated", "NormallyDo_Coded", "Add_ventilation", 
                      "Cant_go_outside_(COVID_related)", "Clean_floor_with_water", "Do_nothing_specific", "Draw_curtains", 
                      "Drink_cold_drink", "Drink_warm_drink", "Drink_water", "Go_outside", "Sit_under_tree", "Sleep_outside", 
                      "Sleep_or_lie_on_floor", "Sleep_or_rest", "Smoke", "Stay_at_home", "Take_a_bath_or_shower", "Turn_off_lights", 
                      "Turn_on_power_source", "Unclear", "Undress_or_change_clothes_or_wet_clothes", "Use_a_cooler", "Use_AC", "Use_fan", 
                      "Use_manual_fan_or_cooling_device", "Use_talcum_powder", "PandemicChange", "YesPandemicChange", 
                      "YesPandemicChange_Translated", "YesPandemicChange_Recoded", 
                      "SpendAtHome", "AmountOfTime", "Income", "EatingHabits", "WaterIntake", "ElectricityUsage", "HealthServices", 
                      "HomeWarm", "TemperatureInsideHome", "TemperatureOutsideHome", "Experience_Blurred_vision", "Experience_Clammy_skin", 
                      "Experience_Concentration_loss", "Experience_Confusion", "Experience_Convulsions", "Experience_Dizziness", 
                      "Experience_DONT_KNOW", "Experience_Fainting_[brief_loss_of_consciousness]", "Experience_Fatigue", 
                      "Experience_Feeling_hot", "Experience_Feeling_listless_or_lack_of_engagement_with_social_activities_or_family", 
                      "Experience_Feeling_sweaty", "Experience_Feeling_thirsty", "Experience_Headache", "Experience_Irrational_behaviour", 
                      "Experience_Loss_of_consciousness_[extensive]", "Experience_Muscle_cramps", "Experience_Muscle_weakness", 
                      "Experience_Nausea", "Experience_Poor_quality_of_sleep", "Experience_Rash", "Experience_REFUSED", 
                      "Experience_Vomiting", "ExperienceBeforeHeat", "ExperienceBeforeHeat_(Blurred_vision)", 
                      "ExperienceBeforeHeat_(Clammy_skin)", "ExperienceBeforeHeat_(Concentration_loss)", "ExperienceBeforeHeat_(Confusion)", 
                      "ExperienceBeforeHeat_(Convulsions)", "ExperienceBeforeHeat_(Dizziness)", 
                      "ExperienceBeforeHeat_(Fainting_[brief_loss_of_consciousness])", "ExperienceBeforeHeat_(Fatigue)", 
                      "ExperienceBeforeHeat_(Feeling_hot)", 
                      "ExperienceBeforeHeat_(Feeling_listless_or_lack_of_engagement_with_social_activities_or_family)", 
                      "ExperienceBeforeHeat_(Feeling_sweaty)", "ExperienceBeforeHeat_(Feeling_thirsty)", 
                      "ExperienceBeforeHeat_(Headache)", "ExperienceBeforeHeat_(Irrational_behaviour)", 
                      "ExperienceBeforeHeat_(Loss_of_consciousness_[extensive])", "ExperienceBeforeHeat_(Muscle_cramps)", 
                      "ExperienceBeforeHeat_(Muscle_weakness)", "ExperienceBeforeHeat_(Nausea)", 
                      "ExperienceBeforeHeat_(Poor_quality_of_sleep)", "ExperienceBeforeHeat_(Rash)", 
                      "ExperienceBeforeHeat_(Vomiting)", "FeelingMore", "PhysicalConflict", "HeatAffect")

pakistan_tidy <- pakistan_cropped %>%
  rename("Region" = "ADM-1") %>%
  mutate(Region = Sindh) %>%
  select(-Sindh, -YesPandemicChange_CodedGeneral, -Language2) %>%
  mutate("Occupation_Translated" = NA, .before = "Occupation_Coded") %>%
  rename("YesPandemicChange_Recoded" = "YesPandemicChange_CodedSpecific") %>%
  rename("ExperienceBeforeHeat_(Concentration_loss)" = "ExperineceBeforeHeat_(Concentration_loss)") %>%
  mutate_at(pakistan_factors, factor)

india_factors <- c("Country", "Agree", "Region", "Gender", "Occupation", "Occupation_Translated", "Occupation_Coded", "OwnHouse", 
                   "CoolHome", "Electricity",  "DrinkingWater", "HouseholdPurposes", "RoofingMaterial", "WallMaterial", "FloorMaterial", 
                   "Windows", "NormallyDo", "NormallyDo_Translated", "NormallyDo_Coded", "Add_ventilation", 
                   "Cant_go_outside_(COVID_related)", "Clean_floor_with_water", "Do_nothing_specific", "Draw_curtains", 
                   "Drink_cold_drink", "Drink_warm_drink", "Drink_water", "Go_outside", "Sit_under_tree", "Sleep_outside", 
                   "Sleep_or_lie_on_floor", "Sleep_or_rest", "Smoke", "Stay_at_home", "Take_a_bath_or_shower", "Turn_off_lights", 
                   "Turn_on_power_source", "Unclear", "Undress_or_change_clothes_or_wet_clothes", "Use_a_cooler", "Use_AC", "Use_fan", 
                   "Use_manual_fan_or_cooling_device", "Use_talcum_powder", "PandemicChange", "YesPandemicChange", 
                   "YesPandemicChange_Translated", "YesPandemicChange_Recoded", 
                   "SpendAtHome", "AmountOfTime", "Income", "EatingHabits", "WaterIntake", "ElectricityUsage", "HealthServices", 
                   "HomeWarm", "TemperatureInsideHome", "TemperatureOutsideHome", "Experience_Blurred_vision", "Experience_Clammy_skin", 
                   "Experience_Concentration_loss", "Experience_Confusion", "Experience_Convulsions", "Experience_Dizziness", 
                   "Experience_DONT_KNOW", "Experience_Fainting_[brief_loss_of_consciousness]", "Experience_Fatigue", 
                   "Experience_Feeling_hot", "Experience_Feeling_listless_or_lack_of_engagement_with_social_activities_or_family", 
                   "Experience_Feeling_sweaty", "Experience_Feeling_thirsty", "Experience_Headache", "Experience_Irrational_behaviour", 
                   "Experience_Loss_of_consciousness_[extensive]", "Experience_Muscle_cramps", "Experience_Muscle_weakness", 
                   "Experience_Nausea", "Experience_Poor_quality_of_sleep", "Experience_Rash", "Experience_REFUSED", 
                   "Experience_Vomiting", "ExperienceBeforeHeat", "ExperienceBeforeHeat_(Blurred_vision)", 
                   "ExperienceBeforeHeat_(Clammy_skin)", "ExperienceBeforeHeat_(Concentration_loss)", "ExperienceBeforeHeat_(Confusion)", 
                   "ExperienceBeforeHeat_(Convulsions)", "ExperienceBeforeHeat_(Dizziness)", 
                   "ExperienceBeforeHeat_(Fainting_[brief_loss_of_consciousness])", "ExperienceBeforeHeat_(Fatigue)", 
                   "ExperienceBeforeHeat_(Feeling_hot)", 
                   "ExperienceBeforeHeat_(Feeling_listless_or_lack_of_engagement_with_social_activities_or_family)", 
                   "ExperienceBeforeHeat_(Feeling_sweaty)", "ExperienceBeforeHeat_(Feeling_thirsty)", 
                   "ExperienceBeforeHeat_(Headache)", "ExperienceBeforeHeat_(Irrational_behaviour)", 
                   "ExperienceBeforeHeat_(Loss_of_consciousness_[extensive])", "ExperienceBeforeHeat_(Muscle_cramps)", 
                   "ExperienceBeforeHeat_(Muscle_weakness)", "ExperienceBeforeHeat_(Nausea)", 
                   "ExperienceBeforeHeat_(Poor_quality_of_sleep)", "ExperienceBeforeHeat_(Rash)", 
                   "ExperienceBeforeHeat_(Vomiting)", "FeelingMore", "PhysicalConflict", "HeatAffect")

india_tidy <- india_cropped %>%
  select(-`ADM-1-IND1`, -`ADM-1-IND2`, -`ADM-1-IND3`, -`ADM-1-IND4`) %>%
  rename("Region" = "ADM-1-IND5") %>%
  mutate("Occupation_Translated" = NA, .before = "Occupation_Coded") %>%
  rename("YesPandemicChange_Recoded" = "YesPandemicChange_CodedSpecific") %>%
  select(-YesPandemicChange_CodedGeneral, -Language2) %>%
  rename("Temperature" = "Temperature_(C)", "Heat_Index" = "Heat_Index_(C)") %>%
  mutate_at(india_factors, factor)




# Join data to make a new dataset including ALL four countries - drop one row from Indonesia (lacks Country variable)
# Subsets to only those households with maximum 24 hours per day of electricity
# Also tidy some variables and create new variables
nexusdata <- bind_rows(cameroon_tidy, indonesia_tidy, pakistan_tidy, india_tidy) %>%
  filter(!is.na(Country)) %>%
  mutate(Language = as_factor(Language)) %>%
  mutate(OptIn_Date = dmy(OptIn_Date)) %>%
  mutate(Region = recode(Region, DOUALA = "Douala", 'Jakarta Special Capital Region' = "Jakarta")) %>%
  mutate(City = as_factor(str_c(Country, " - ", Region))) %>%
  mutate(Country = fct_relevel(Country, c("Pakistan",
                                          "India",
                                          "Indonesia",
                                          "Cameroon"))) %>%
  mutate(Gender = as_factor(str_to_sentence(Gender))) %>%
  mutate(DrinkingWater = as_factor(recode(DrinkingWater, 
                                          "BOTTLES" = "bottled water",
                                          'COMMUNAL TAP/SHARED TAP [ALSO CALLED STAND PIPE/STREET END TAP/YARD TAP]' = "shared tap",
                                          'SUPPLIED IN TANKS' = "supplied in tanks",
                                          "OTHER" = "other"))) %>%
  mutate(HouseholdPurposes = recode(HouseholdPurposes,
                                    'COMMUNAL OR STREET-END TAP' = "shared tap",
                                    "OTHER" = "other",
                                    'SUPPLIED IN TANKS' = "supplied in tanks")) %>%
  filter(HoursDay<25) %>% # Remove unrealistic hours of electricity per day
  filter(People_in_House<16) %>% # Remove outliers (99.9% of the data)
  mutate(SpendAtHome = as_factor(str_to_sentence(SpendAtHome))) %>%
  mutate(SpendAtHome = fct_relevel(SpendAtHome, c("Most of the day - except for short trips out", 
                                                "Half of the day", 
                                                "Some of the day",
                                                "Very little - only for sleeping", 
                                                "Other", 
                                                "Don't know", 
                                                "Refused"))) %>%
  mutate(AmountOfTime = as_factor(str_to_sentence(AmountOfTime))) %>%
  mutate(AmountOfTime = fct_relevel(AmountOfTime, c("Significantly increased", 
                                                  "Slightly increased", 
                                                  "Remained about the same",
                                                  "Slightly decreased", 
                                                  "Significantly decreased", 
                                                  "Don't know", 
                                                  "Refused"))) %>%
  mutate(Income = as_factor(str_to_sentence(Income))) %>%
  mutate(Income = fct_relevel(Income, c("Significantly increased", 
                                                    "Slightly increased", 
                                                    "Remained about the same",
                                                    "Slightly decreased", 
                                                    "Significantly decreased", 
                                                    "Don't know", 
                                                    "Refused"))) %>%
  mutate(Occupation_Coded = as_factor(str_to_sentence(Occupation_Coded))) %>%
  mutate(EatingHabits = fct_relevel(EatingHabits, c("I EAT MORE - IT IS ENOUGH", 
                                        "NO CHANGE - IT IS ENOUGH", 
                                        "NO CHANGE - IT IS NOT ENOUGH", 
                                        "I EAT LESS - IT IS ENOUGH",
                                        "I EAT LESS - IT IS NOT ENOUGH", 
                                        "DON'T KNOW"))) %>%
  mutate(WaterIntake = as_factor(str_to_sentence(WaterIntake))) %>%
  mutate(WaterIntake = as_factor(recode(WaterIntake, 
                                        "Yes - i use more" = "Yes - I use more",
                                        "Yes - i use less" = "Yes - I use less"))) %>%
  mutate(WaterIntake = fct_relevel(WaterIntake, c("Yes - I use more",
                                                  "No - no change",
                                                  "Yes - I use less",
                                                  "Don't know",
                                                  "Refused"))) %>%
  mutate(ElectricityUsage = fct_relevel(ElectricityUsage, c("I HAVE BEEN ABLE TO USE MORE ENERGY",
                                                  "NO CHANGE",
                                                  "I HAVE HAD TO USE LESS ENERGY",
                                                  "DON'T KNOW",
                                                  "REFUSED"))) %>%
  mutate(ElectricityUsage = as_factor(str_to_sentence(ElectricityUsage))) %>%
  mutate(Electricity = str_to_sentence(Electricity)) %>%
  mutate(Electricity = fct_relevel(Electricity, c("Solar", 
                                                  "Generator",
                                                  "12-volt battery",
                                                  "Informal connection",
                                                  "Other"))) %>%
  mutate(HealthServices = as_factor(str_to_sentence(HealthServices))) %>%
  mutate(HealthServices = fct_relevel(HealthServices, c("Harder", 
                                        "The same", 
                                        "Easier", 
                                        "Refused",
                                        "Don't know"))) %>%
  mutate(HomeWarm = as_factor(str_to_sentence(HomeWarm))) %>%
  mutate(HomeWarm = fct_relevel(HomeWarm, c("Very hot",
                                            "Hot",
                                            "Warm",
                                            "Neutral",
                                            "Slightly cool",
                                            "Cool",
                                            "Cold",
                                            "Don't know"))) %>%
  mutate(TemperatureInsideHome = as_factor(str_to_sentence(TemperatureInsideHome))) %>%
  mutate(TemperatureInsideHome = fct_relevel(TemperatureInsideHome, c("Very hot",
                                            "Hot",
                                            "Warm",
                                            "Slightly warm",
                                            "Comfortable",
                                            "Slightly cool",
                                            "Cool",
                                            "Cold",
                                            "Don't know",
                                            "Refused"))) %>%
  mutate(TemperatureOutsideHome = as_factor(str_to_sentence(TemperatureOutsideHome))) %>%
  mutate(TemperatureOutsideHome = fct_relevel(TemperatureOutsideHome, c("Intolerable", 
                                                                        "Very difficult to tolerate", 
                                                                        "Fairly difficult to tolerate",
                                                                        "Slightly difficult to tolerate",
                                                                        "Perfectly tolerable",
                                                                        "Don't know",
                                                                        "Refused"))) %>%
  mutate(Experience_DONT_KNOW = fct_explicit_na(Experience_DONT_KNOW, na_level = "No")) %>%
  select(!c(Agree, Occupation, Occupation_Translated, YesPandemicChange, YesPandemicChange_Translated, NormallyDo, NormallyDo_Translated))


# Make some new variables
newnexus <- nexusdata %>%
  mutate(Employment = as_factor(recode(Occupation_Coded, # Note that this has already been done into four categories - see report
                                       'EMPLOYED IN PRIVATE COMPANY' = "Working",
                                       'GOVERNMENT WORK' = "Working",
                                       'PAID LABOR/WAGE' = "Working",
                                       'HOUSEWIFE' = "Homemaker",
                                       'HOUSEWIFE/HUSBAND/HOMEMAKER' = "Homemaker",
                                       'AGRICULTURE/HUSBANDRY/FISHING' = "Working",
                                       'INFORMAL TRADE / STREET SALES' = "Working",
                                       'BUSINESS/SELF-EMPLOYED' = "Working",
                                       'STUDENT' = "Student",
                                       'UNEMPLOYED' = "Not working",
                                       'GOVERNMENT ASSISTANCE / SOCIAL PROTECTION NETWORKS [PENSIONS]' = "Not working",
                                       'MIGRANT REMITTANCES [FROM OUTSIDE OF THE COUNTRY]' = "Not working",
                                       'GOVERNMENT ASSISTANCE/SOCIAL PROTECTION NETWORKS [PENSIONS]' = "Not working",
                                       'HELP FROM FAMILY AND/OR FRIENDS [FROM INSIDE OF THE COUNTRY]' = "Not working"))) %>%
  mutate(wallmass = recode(WallMaterial,
                           "BAMBOO POLES OR WOOD" = "Lightweight",
                           "MUD BRICK [CRUDE/RAW/COOKED]" = "Heavyweight",
                           "PALM FRONDS/WOVEN MATS" = "Lightweight",
                           "REINFORCED CONCRETE" = "Heavyweight",
                           "DON'T KNOW"= "Don't know",
                           "REFUSED" = "Refused")) %>%
  mutate(roofmass = recode(RoofingMaterial,
                           "BAMBOO" = "Lightweight",
                           "GALVANISED IRON"= "Lightweight",
                           "PALM FRONDS"= "Lightweight",
                           "REINFORCED CONCRETE"= "Heavyweight",
                           "SHEET METAL [TIN/ZINC/CORRUGATED IRON]"= "Lightweight",
                           "T-GIRDER"= "Heavyweight",
                           "WOODEN SHINGLES"= "Lightweight",
                           "CERAMIC TILE"= "Heavyweight",
                           "DON'T KNOW"= "Don't know",
                           "DRIED CLAY"= "Heavyweight",
                           "REFUSED" = "Refused")) %>%
  mutate(walltherm = recode(WallMaterial, "BAMBOO POLES OR WOOD" = "Lightweight low thermal conductivity",
                            "MUD BRICK [CRUDE/RAW/COOKED]" = "Heavyweight low thermal conductivity",
                            "PALM FRONDS/WOVEN MATS" = "Lightweight low thermal conductivity",
                            "REINFORCED CONCRETE" = "Heavyweight high thermal conductivity",
                            "DON'T KNOW"= "Don't know",
                            "REFUSED" = "Refused")) %>%
  mutate(rooftherm = recode(RoofingMaterial,
                            "BAMBOO" = "Lightweight low thermal conductivity",
                            "GALVANISED IRON"= "Lightweight high thermal conductivity",
                            "PALM FRONDS"= "Lightweight low thermal conductivity",
                            "REINFORCED CONCRETE"= "Heavyweight high thermal conductivity",
                            "SHEET METAL [TIN/ZINC/CORRUGATED IRON]"= "Lightweight high thermal conductivity",
                            "T-GIRDER"= "Heavyweight high thermal conductivity",
                            "WOODEN SHINGLES"= "Lightweight low thermal conductivity",
                            "CERAMIC TILE"= "Heavyweight low thermal conductivity",
                            "DON'T KNOW"= "Don't know",
                            "DRIED CLAY"= "Heavyweight low thermal conductivity",
                            "REFUSED" = "Refused")) %>%
  mutate(TemperatureInsideHomeCat = recode(TemperatureInsideHome,
                                          "very hot" = "Hot", 
                                          "hot" = "Hot", 
                                          "warm" = "Hot", 
                                          "slightly warm" = "Hot", 
                                          "comfortable" = "Comfortable",
                                          "slightly cool" = "Cold",
                                          "cool" = "Cold",
                                          "cold" =  "Cold")) %>%
  mutate(HoursDayCat = cut(HoursDay, breaks=seq(0,24,4), labels=c("0-4","5-8","9-12", "13-16", "17-20", "21-24"))) %>%
  mutate(pseudoID = row_number()) %>%
  mutate(WallMaterial = str_to_sentence(WallMaterial)) %>%
  mutate(RoofingMaterial = str_to_sentence(RoofingMaterial))

nexusNormallyDo <- newnexus %>% pivot_longer(cols = Add_ventilation:Use_talcum_powder,
                                             names_to = "NormallyDo_New",
                                             values_to = "NormallyDo_Selection") %>%
  group_by(NormallyDo_New, NormallyDo_Selection) %>%
  mutate(NormallyDo_New = as_factor(NormallyDo_New))

nexusExperience <- newnexus %>% pivot_longer(cols = Experience_Blurred_vision:Experience_Vomiting,
                                             names_to = "Experience_New",
                                             values_to = "Experience_Selection") %>%
  group_by(Experience_New, Experience_Selection) %>%
  mutate(Experience_New = as_factor(Experience_New))

nexusExperienceBeforeHeat <- newnexus %>% pivot_longer(cols = `ExperienceBeforeHeat_(Blurred_vision)`:`ExperienceBeforeHeat_(Vomiting)`,
                                                       names_to = "ExperienceBeforeHeat_New",
                                                       values_to = "ExperienceBeforeHeat_Selection") %>%
  group_by(ExperienceBeforeHeat_New, ExperienceBeforeHeat_Selection) %>%
  mutate(ExperienceBeforeHeat_New = as_factor(ExperienceBeforeHeat_New))

Graphs from previous paper

Pakistan

library(tidyverse)

# Graphs for report

cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7") # From http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette
newnames <- names(newnexus)


# Page 33
ggplot(data = newnexus %>% filter(Country=="Pakistan") %>%
         pivot_longer(cols = Add_ventilation:Use_talcum_powder,
                      names_to = "NormallyDo_New",
                      values_to = "Selection") %>%
         group_by(NormallyDo_New, Selection) %>%
         mutate(NormallyDo_New = as_factor(NormallyDo_New)) %>%
         summarise(n = n()) %>%
         filter(Selection == "Yes") %>%
         arrange(desc(n))) +
  geom_bar(aes(x = reorder(NormallyDo_New, n), y = n), stat = "identity", fill = "#999999") +
  scale_x_discrete(labels = c("Take_a_bath_or_shower" = "Take a bath or shower",
                              "Go_outside" = "Go outside",
                              "Use_fan" = "Use fan",
                              "Do_nothing_specific" = "Do nothing specific",
                              "Drink_cold_drink" = "Drink cold drink",
                              "Use_manual_fan_or_cooling_device" = "Use manual fan or cooling device",
                              "Add_ventilation" = "Add ventilation",
                              "Turn_on_power_source" = "Turn on power source",
                              "Drink_water" = "Drink water",
                              "Use_a_cooler" = "Use a cooler",
                              "Clean_floor_with_water" = "Clean floor with water",
                              "Stay_at_home" = "Stay at home",
                              "Sleep_or_rest" = "Sleep or rest",
                              "Use_talcum_powder" = "Use talcum powder",
                              "Use_AC" = "Use AC",
                              "Undress_or_change_clothes_or_wet_clothes" = "Undress or change clothes or wet clothes",
                              "Drink_warm_drink" = "Drink warm drink",
                              "Sit_under_tree" = "Sit under tree")) +
  xlab("Strategies normally used to manage heat") +
  coord_flip()

# Page 34
newnexus %>% 
  filter(Country == "Pakistan") %>%
  group_by(SpendAtHome, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = SpendAtHome, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Time spent at home before pandemic") +
  ylab("Percentage of group")

# Page 35
newnexus %>% 
  filter(Country == "Pakistan") %>%
  group_by(AmountOfTime, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = AmountOfTime, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Change in time at home after pandemic") +
  ylab("Percentage of group")

# Page 36
ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = Electricity), position = "dodge", fill = "#999999") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  ylab("n") +
  xlab("Source of electricity")

ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = HoursDay), fill = "#999999") +
  scale_x_continuous(breaks=seq(0,24,1)) +
  xlab("Hours of electricity per day") +
  ylab("n")

# Page 37
ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = Electricity, fill = HoursDayCat), position = "dodge") +
  scale_fill_manual(values = cbPalette) +
  xlab("Source of electricity") +
  ylab("n") +
  labs(fill = "Hours of electricity per day")

# Page 38
ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = reorder(ElectricityUsage, desc(ElectricityUsage))), fill = "#999999") +
  coord_flip() +
  xlab("Change in use of electricity") +
  ylab("n") +
  theme(legend.position = "none") 

ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = reorder(ElectricityUsage, desc(ElectricityUsage)), fill = City), position = "dodge") +
  coord_flip() +
  scale_fill_manual(values = cbPalette) +
  xlab("Change in use of electricity") +
  ylab("n") +
  facet_grid(rows = vars(City)) +
  theme(legend.position = "none")

# Page 39
ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = reorder(WaterIntake, desc(WaterIntake))), fill = "#999999") +
  coord_flip() +
  xlab("Change in water intake") +
  ylab("n")

ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = reorder(WaterIntake, desc(WaterIntake)), fill = City), position = "dodge") +
  coord_flip() +
  scale_fill_manual(values = cbPalette) +
  xlab("Change in water intake") +
  ylab("n") +
  facet_grid(rows = vars(City)) 

  theme(legend.position = "none")
## List of 1
##  $ legend.position: chr "none"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi FALSE
##  - attr(*, "validate")= logi TRUE
ggplot(data = newnexus %>% filter(Country=="Pakistan")) +
  geom_bar(aes(x = NormallyDo_Coded)) +
  coord_flip() # clearly some problems with NormallyDo_Coded - too many categories - need to be reorganised according to cats in report page 33

ggplot(data = newnexus %>% filter(Country=="Pakistan")) +
  geom_bar(aes(x = SpendAtHome, fill = Gender), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) # Works okay but needs the categories to be reordered

ggplot(data = newnexus %>% filter(Country=="Pakistan")) +
  geom_bar(aes(x = AmountOfTime, fill = Gender), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) # Works okay but we should use less stereotyping colours for the genders

ggplot(data = newnexus %>% filter(Country=="Pakistan", HoursDay < 25)) +
  geom_histogram(aes(x = HoursDay), position = "dodge") + #Still got some 88 value in here that should go
  scale_x_continuous(n.breaks = 24) +
  stat_ecdf(aes(x = HoursDay), geom = "step", pad = "FALSE")

  geom_line(aes(y = aes(cumsum(HoursDay), x = seq(1:24)))) # This doesn't work
## mapping: y = ~aes(cumsum(HoursDay), x = seq(1:24)) 
## geom_line: na.rm = FALSE, orientation = NA
## stat_identity: na.rm = FALSE
## position_identity

India

# Page 51
ggplot(data = newnexus %>% filter(Country == "India")) +
  geom_bar(aes(x = Electricity, fill = HoursDayCat), position = "dodge") +
  scale_fill_manual(values = cbPalette) +
  xlab("Source of electricity") +
  ylab("n") +
  labs(fill = "Hours of electricity per day")

ggplot(data = newnexus %>% filter(Country=="India") %>%
         pivot_longer(cols = Add_ventilation:Use_talcum_powder,
                      names_to = "NormallyDo_New",
                      values_to = "Selection") %>%
         group_by(NormallyDo_New, Selection) %>%
         mutate(NormallyDo_New = as_factor(NormallyDo_New)) %>%
         summarise(n = n()) %>%
         filter(Selection == "Yes") %>%
         arrange(desc(n))) +
  geom_bar(aes(x = reorder(NormallyDo_New, n), y = n), stat = "identity", fill = "#E69F00") +
  scale_x_discrete(labels = c("Take_a_bath_or_shower" = "Take a bath or shower",
                              "Go_outside" = "Go outside",
                              "Use_fan" = "Use fan",
                              "Do_nothing_specific" = "Do nothing specific",
                              "Drink_cold_drink" = "Drink cold drink",
                              "Use_manual_fan_or_cooling_device" = "Use manual fan or cooling device",
                              "Add_ventilation" = "Add ventilation",
                              "Turn_on_power_source" = "Turn on power source",
                              "Drink_water" = "Drink water",
                              "Use_a_cooler" = "Use a cooler",
                              "Clean_floor_with_water" = "Clean floor with water",
                              "Stay_at_home" = "Stay at home",
                              "Sleep_or_rest" = "Sleep or rest",
                              "Use_talcum_powder" = "Use talcum powder",
                              "Use_AC" = "Use AC",
                              "Undress_or_change_clothes_or_wet_clothes" = "Undress or change clothes or wet clothes",
                              "Drink_warm_drink" = "Drink warm drink",
                              "Sit_under_tree" = "Sit under tree",
                              "Cant_go_outside_(COVID_related)" = "Can't go outside (COVID-related)")) +
  xlab("Strategies normally used to manage heat") +
  coord_flip()

# Page 52
newnexus %>% # Fantastic example from Simon Brauer https://stackoverflow.com/questions/37008705/ggplot-bar-chart-of-percentages-over-groups
  filter(Country == "India") %>%
  group_by(SpendAtHome, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = SpendAtHome, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Change in time at home after pandemic") +
  ylab("Percentage of group")

# Page 53
newnexus %>% # Fantastic example from Simon Brauer https://stackoverflow.com/questions/37008705/ggplot-bar-chart-of-percentages-over-groups
  filter(Country == "India") %>%
  group_by(AmountOfTime, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = AmountOfTime, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Change in time at home after pandemic") +
  ylab("Percentage of group")

Indonesia

# Page 66
ggplot(data = newnexus %>% filter(Country == "Indonesia")) +
  geom_bar(aes(x = Occupation_Coded), fill = "#56B4E9") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  xlab("Occupation") +
  ylab("n")

ggplot(data = newnexus %>% filter(Country == "Indonesia")) +
  geom_bar(aes(x = Electricity, fill = HoursDayCat), position = "dodge") +
  ylab("n") +
  xlab("Source of electricity") +
  labs(fill = "Hours of electricity per day")

# Page 67
ggplot(data = newnexus %>% filter(Country=="Indonesia") %>%
         pivot_longer(cols = Add_ventilation:Use_talcum_powder,
                      names_to = "NormallyDo_New",
                      values_to = "Selection") %>%
         group_by(NormallyDo_New, Selection) %>%
         mutate(NormallyDo_New = as_factor(NormallyDo_New)) %>%
         summarise(n = n()) %>%
         filter(Selection == "Yes") %>%
         arrange(desc(n))) +
  geom_bar(aes(x = reorder(NormallyDo_New, n), y = n), stat = "identity", fill = "#56B4E9") +
  scale_x_discrete(labels = c("Use_fan" = "Use fan",
                              "Add_ventilation" = "Add ventilation",
                              "Go_outside" = "Go outside",
                              "Take_a_bath_or_shower" = "Take a bath or shower",
                              "Undress_or_change_clothes_or_wet_clothes" = "Undress or change clothes or wet clothes",
                              "Use_AC" = "Use AC",
                              "Use_manual_fan_or_cooling_device" = "Use manual fan or cooling device",
                              "Drink_water" = "Drink water",
                              "Sleep_or_lie_on_floor" = "Sleep or lie on floor",
                              "Sit_under_tree" = "Sit under tree",
                              "Turn_off_lights" = "Turn off lights",
                              "Sleep_or_rest" = "Sleep or rest")) +
  xlab("Strategies normally used to manage heat") +
  coord_flip()

# Page 68
newnexus %>% # Fantastic example from Simon Brauer https://stackoverflow.com/questions/37008705/ggplot-bar-chart-of-percentages-over-groups
  filter(Country == "Indonesia") %>%
  group_by(SpendAtHome, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = SpendAtHome, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Time spent at home before pandemic") +
  ylab("Percentage of group")

newnexus %>% # Fantastic example from Simon Brauer https://stackoverflow.com/questions/37008705/ggplot-bar-chart-of-percentages-over-groups
  filter(Country == "Indonesia") %>%
  group_by(AmountOfTime, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = AmountOfTime, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Change in time spent at home after pandemic") +
  ylab("Percentage of group")

# Page 74
ggplot(data = newnexus %>% filter(Country=="Indonesia") %>%
         group_by(YesPandemicChange_Recoded) %>%
         summarise(n = n()) %>%
         filter(YesPandemicChange_Recoded != "N/A") %>%
         arrange(-n)) +
  geom_bar(aes(x = reorder(YesPandemicChange_Recoded, n), y = n), stat = "identity", fill = "#56B4E9") +
  xlab("Strategies to manage heat during pandemic") +
  coord_flip()

Cameroon

# Page 82
ggplot(data = newnexus %>% filter(Country == "Cameroon")) +
  geom_bar(aes(x = Occupation_Coded), fill = "#009E73") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  xlab("Occupation") +
  ylab("n")

newnexus %>% # Fantastic example from Simon Brauer https://stackoverflow.com/questions/37008705/ggplot-bar-chart-of-percentages-over-groups
  filter(Country == "Cameroon") %>%
  group_by(Occupation_Coded, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = Occupation_Coded, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Occupation") +
  ylab("Percentage of group")

# Page 84
ggplot(data = newnexus %>% filter(Country=="Cameroon") %>%
         pivot_longer(cols = Add_ventilation:Use_talcum_powder,
                      names_to = "NormallyDo_New",
                      values_to = "Selection") %>%
         group_by(NormallyDo_New, Selection) %>%
         mutate(NormallyDo_New = as_factor(NormallyDo_New)) %>%
         summarise(n = n()) %>%
         filter(Selection == "Yes") %>%
         arrange(desc(n))) +
  geom_bar(aes(x = reorder(NormallyDo_New, n), y = n), stat = "identity", fill = "#009E73") +
  scale_x_discrete(labels = c("Take_a_bath_or_shower" = "Take a bath or shower",
                              "Go_outside" = "Go outside",
                              "Use_fan" = "Use fan",
                              "Do_nothing_specific" = "Do nothing specific",
                              "Drink_cold_drink" = "Drink cold drink",
                              "Use_manual_fan_or_cooling_device" = "Use manual fan or cooling device",
                              "Add_ventilation" = "Add ventilation",
                              "Turn_on_power_source" = "Turn on power source",
                              "Drink_water" = "Drink water",
                              "Use_a_cooler" = "Use a cooler",
                              "Clean_floor_with_water" = "Clean floor with water",
                              "Stay_at_home" = "Stay at home",
                              "Sleep_or_rest" = "Sleep or rest",
                              "Use_talcum_powder" = "Use talcum powder",
                              "Use_AC" = "Use AC",
                              "Undress_or_change_clothes_or_wet_clothes" = "Undress or change clothes or wet clothes",
                              "Drink_warm_drink" = "Drink warm drink",
                              "Sit_under_tree" = "Sit under tree",
                              "Cant_go_outside_(COVID_related)" = "Can't go outside (COVID-related)",
                              "Draw_curtains" = "Draw curtains",
                              "Sleep_or_lie_on_floor" = "Sleep or lie on floor")) +
  xlab("Strategies normally used to manage heat") +
  coord_flip()

# Page 85
ggplot(data = newnexus %>% filter(Country == "Cameroon")) +
  geom_bar(aes(x = Electricity, fill = HoursDayCat), position = "dodge") +
  ylab("n") +
  xlab("Source of electricity") +
  labs(fill = "Hours of electricity per day")

# Page 86
newnexus %>% # Fantastic example from Simon Brauer https://stackoverflow.com/questions/37008705/ggplot-bar-chart-of-percentages-over-groups
  filter(Country == "Cameroon") %>%
  group_by(SpendAtHome, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = SpendAtHome, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Time spent at home before pandemic") +
  ylab("Percentage of group")

newnexus %>% # Fantastic example from Simon Brauer https://stackoverflow.com/questions/37008705/ggplot-bar-chart-of-percentages-over-groups
  filter(Country == "Cameroon") %>%
  group_by(AmountOfTime, Gender) %>%
  count() %>%
  group_by(Gender) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = AmountOfTime, y = percentage, fill = Gender)) +
  geom_bar(position = "dodge", stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = cbPalette) +
  xlab("Change in time spent at home after pandemic") +
  ylab("Percentage of group")

All countries

# Page 97
      # No age distribution data in my data sets

ggplot(data = newnexus) +
  geom_bar(aes(x = Country, fill = Gender), position = "dodge") +
  scale_fill_manual(values = cbPalette) +
  ylab("n")

# Page 98
ggplot(data = newnexus) +
  geom_bar(aes(x = Occupation_Coded, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  xlab("Occupation") +
  ylab("n")

# Page 99
ggplot(data = newnexus) +
  geom_bar(aes(x = RoofingMaterial, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1)

# Page 100
ggplot(data = newnexus) +
  geom_bar(aes(x = WallMaterial, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1)

ggplot(data = newnexus) +
  geom_bar(aes(x = FloorMaterial, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1)

# Page 103
ggplot(data = newnexus) +
  geom_bar(aes(x = TemperatureOutsideHome, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1) +
  xlab("Thermal comfort outside the home")

ggplot(data = newnexus) +
  geom_bar(aes(x = TemperatureInsideHome, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1) +
  xlab("Thermal comfort inside the home")

# Page 105
ggplot(data = newnexus) +
  geom_bar(aes(x = SpendAtHome, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1) +
  xlab("Time spent at home before pandemic") +
  ylab("n")

ggplot(data = newnexus) +
  geom_bar(aes(x = AmountOfTime, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1) +
  xlab("Change in time spent at home after pandemic") +
  ylab("Percentage of group")

# Page 108
ggplot(data = newnexus) +
  geom_bar(aes(x = HoursDay, fill = Country)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1) +
  scale_x_continuous(breaks=seq(0,24,1)) +
  xlab("Hours of electricity per day") +
  ylab("n")

ggplot(data = newnexus) +
  geom_bar(aes(x = TemperatureInsideHome, fill = TemperatureInsideHome)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = TemperatureInsideHomeCat, fill = TemperatureInsideHomeCat)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus %>% filter(Country == "Pakistan")) +
  geom_bar(aes(x = WaterIntake)) +
  scale_y_continuous(labels = scales::percent)

ggplot(data = nexusdata) +
  geom_point(aes(x = Temperature, y = Relative_Humidity, colour = City, size = Heat_Index)) +
  scale_size_binned(n.breaks = 8)

ggplot(data = nexusdata) +
  geom_point(aes(x = Temperature, y = Relative_Humidity, colour = Country, size = Heat_Index)) +
  scale_size_binned(n.breaks = 8)

ggplot(data = newnexus) +
  geom_jitter(aes(x = Temperature, y = HoursDay, colour = City))

ggplot(data = newnexus) +
  geom_bar(aes(x = Rooms, fill = City), position = "dodge")

ggplot(data = newnexus) +
  geom_bar(aes(x = People_in_House, fill = City), position = "dodge")

ggplot(data = newnexus) +
  geom_bar(aes(x = People_in_House, fill = factor(Rooms)), position = "dodge") +
  scale_x_continuous(n.breaks = 20)

ggplot(data = newnexus) +
  geom_bar(aes(x = People_in_House, fill = factor(Rooms)), position = "dodge") +
  facet_grid(rows = vars(Country)) +
  scale_x_continuous(n.breaks = 20)

ggplot(data = newnexus) +
  geom_bar(aes(x = TemperatureInsideHome, fill = TemperatureOutsideHome)) +
  facet_grid(rows = vars(TemperatureOutsideHome))

ggplot(data = newnexus) +
  geom_bar(aes(x = Temperature, fill = TemperatureOutsideHome)) +
  facet_grid(rows = vars(TemperatureOutsideHome))

ggplot(data = newnexus) +
  geom_bar(aes(x = Temperature, fill = TemperatureInsideHome)) +
  facet_grid(rows = vars(TemperatureInsideHome))

ggplot(data = nexusdata) +
  geom_bar(aes(x = SpendAtHome)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = SpendAtHome, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = SpendAtHome, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = AmountOfTime)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = AmountOfTime, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = AmountOfTime, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = Income)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = Income, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = Income, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = EatingHabits)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = EatingHabits, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = EatingHabits, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = WaterIntake)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = WaterIntake, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = WaterIntake, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = ElectricityUsage)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = ElectricityUsage, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = ElectricityUsage, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = HealthServices)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = HealthServices, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = HealthServices, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = HomeWarm)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = HomeWarm, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = HomeWarm, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = HomeWarm)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  facet_grid(rows = vars(Country))

ggplot(data = nexusdata) +
  geom_bar(aes(x = TemperatureInsideHome)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = TemperatureInsideHome, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = TemperatureInsideHome, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = TemperatureOutsideHome)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = TemperatureOutsideHome, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = nexusdata) +
  geom_bar(aes(x = TemperatureOutsideHome, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = WallMaterial)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = WallMaterial)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = wallmass)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = walltherm)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = RoofingMaterial)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = RoofingMaterial)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = roofmass)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = rooftherm)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = wallmass, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = wallmass, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = roofmass)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = roofmass, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = roofmass, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = walltherm)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = walltherm, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = walltherm, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = rooftherm)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = rooftherm, fill = City), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = rooftherm, fill = Country), position = "dodge") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = Temperature, fill = rooftherm)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = Windows, fill = rooftherm)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = Windows, fill = walltherm)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus %>% filter(TemperatureInsideHome!="don't know"&TemperatureInsideHome!="refused")) +
  geom_bar(aes(x = Windows, fill = TemperatureInsideHome)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus %>% filter(TemperatureInsideHome!="don't know"&TemperatureInsideHome!="refused")) +
  geom_bar(aes(x = Rooms, fill = TemperatureInsideHome)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus %>% filter(TemperatureInsideHome!="don't know"&TemperatureInsideHome!="refused")) +
  geom_bar(aes(x = Windows, fill = Country), position = "dodge") +
  facet_grid(rows = vars(TemperatureInsideHome))

ggplot(data = newnexus) +
  geom_bar(aes(x = wallmass, fill = roofmass))

ggplot(data = newnexus) +
  geom_bar(aes(x = wallmass, fill = roofmass)) +
  facet_grid(rows = vars(Country))

ggplot(data = newnexus) +
  geom_bar(aes(x = walltherm, fill = rooftherm)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

ggplot(data = newnexus) +
  geom_bar(aes(x = walltherm, fill = rooftherm)) +
  facet_grid(rows = vars(Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

##########################

ggplot(data = nexusdata) +
  geom_violin(aes(x = City, y = HoursDay))

ggplot(data = nexusdata) +
  geom_histogram(aes(x = HoursDay, fill = City), binwidth = 2) +
    facet_grid(rows = vars(City))

ggplot(data = nexusdata) +
  geom_histogram(aes(x = People_in_House, fill = City), binwidth = 2) +
  facet_grid(rows = vars(City))

ggplot(data = nexusdata) +
  geom_bar(aes(x = Windows, fill = City)) +
  facet_grid(rows = vars(City))

Table 1 creation

Characteristics of the population

library(table1)
nexusdata2<-nexusdata
fac_cols <- sapply(nexusdata, is.character)     
nexusdata2[fac_cols] <- lapply(nexusdata2[fac_cols], as.factor)

#Use the table1 command to produce a table 1
t1<-table1(~ Gender + Occupation_Coded + Language | Country, nexusdata2)
t1
Pakistan
(N=1159)
India
(N=1180)
Indonesia
(N=1105)
Cameroon
(N=1101)
Overall
(N=4545)
Gender
Female 554 (47.8%) 431 (36.5%) 541 (49.0%) 386 (35.1%) 1912 (42.1%)
Male 605 (52.2%) 749 (63.5%) 564 (51.0%) 715 (64.9%) 2633 (57.9%)
Occupation_Coded
Unemployed 33 (2.8%) 0 (0%) 68 (6.2%) 81 (7.4%) 182 (4.0%)
Government work 43 (3.7%) 1 (0.1%) 12 (1.1%) 12 (1.1%) 68 (1.5%)
Informal trade / street sales 45 (3.9%) 618 (52.4%) 33 (3.0%) 290 (26.3%) 986 (21.7%)
Business/self-employed 150 (12.9%) 154 (13.1%) 319 (28.9%) 210 (19.1%) 833 (18.3%)
Paid labor/wage 119 (10.3%) 317 (26.9%) 132 (11.9%) 221 (20.1%) 789 (17.4%)
Student 205 (17.7%) 0 (0%) 16 (1.4%) 22 (2.0%) 243 (5.3%)
Agriculture/husbandry/fishing 26 (2.2%) 14 (1.2%) 6 (0.5%) 131 (11.9%) 177 (3.9%)
Employed in private company 165 (14.2%) 26 (2.2%) 253 (22.9%) 64 (5.8%) 508 (11.2%)
Help from family and/or friends [from inside of the country] 3 (0.3%) 26 (2.2%) 0 (0%) 27 (2.5%) 56 (1.2%)
Housewife 0 (0%) 0 (0%) 0 (0%) 34 (3.1%) 34 (0.7%)
Government assistance/social protection networks [pensions] 8 (0.7%) 3 (0.3%) 0 (0%) 8 (0.7%) 19 (0.4%)
Migrant remittances [from outside of the country] 1 (0.1%) 21 (1.8%) 0 (0%) 1 (0.1%) 23 (0.5%)
Housewife/husband/homemaker 288 (24.8%) 0 (0%) 258 (23.3%) 0 (0%) 546 (12.0%)
Don't know 26 (2.2%) 0 (0%) 6 (0.5%) 0 (0%) 32 (0.7%)
Refused 47 (4.1%) 0 (0%) 1 (0.1%) 0 (0%) 48 (1.1%)
Government assistance / social protection networks [pensions] 0 (0%) 0 (0%) 1 (0.1%) 0 (0%) 1 (0.0%)
Language
French 0 (0%) 0 (0%) 0 (0%) 1072 (97.4%) 1072 (23.6%)
English 0 (0%) 1 (0.1%) 0 (0%) 29 (2.6%) 30 (0.7%)
Urdu 1159 (100%) 0 (0%) 0 (0%) 0 (0%) 1159 (25.5%)
Hindi 0 (0%) 1179 (99.9%) 0 (0%) 0 (0%) 1179 (25.9%)
Missing 0 (0%) 0 (0%) 1105 (100%) 0 (0%) 1105 (24.3%)

Housing materials and windows

t2<-table1(~ wallmass + roofmass + walltherm + rooftherm + Windows | Country, data = newnexus)
t2
Pakistan
(N=1159)
India
(N=1180)
Indonesia
(N=1105)
Cameroon
(N=1101)
Overall
(N=4545)
wallmass
Lightweight 16 (1.4%) 643 (54.5%) 53 (4.8%) 240 (21.8%) 952 (20.9%)
Heavyweight 1117 (96.4%) 535 (45.3%) 1036 (93.8%) 861 (78.2%) 3549 (78.1%)
Don't know 18 (1.6%) 2 (0.2%) 16 (1.4%) 0 (0%) 36 (0.8%)
Refused 8 (0.7%) 0 (0%) 0 (0%) 0 (0%) 8 (0.2%)
roofmass
Lightweight 239 (20.6%) 1086 (92.0%) 688 (62.3%) 706 (64.1%) 2719 (59.8%)
Heavyweight 896 (77.3%) 94 (8.0%) 404 (36.6%) 395 (35.9%) 1789 (39.4%)
Don't know 14 (1.2%) 0 (0%) 13 (1.2%) 0 (0%) 27 (0.6%)
Refused 10 (0.9%) 0 (0%) 0 (0%) 0 (0%) 10 (0.2%)
walltherm
Lightweight low thermal conductivity 16 (1.4%) 643 (54.5%) 53 (4.8%) 240 (21.8%) 952 (20.9%)
Heavyweight low thermal conductivity 442 (38.1%) 467 (39.6%) 651 (58.9%) 168 (15.3%) 1728 (38.0%)
Heavyweight high thermal conductivity 675 (58.2%) 68 (5.8%) 385 (34.8%) 693 (62.9%) 1821 (40.1%)
Don't know 18 (1.6%) 2 (0.2%) 16 (1.4%) 0 (0%) 36 (0.8%)
Refused 8 (0.7%) 0 (0%) 0 (0%) 0 (0%) 8 (0.2%)
rooftherm
Lightweight low thermal conductivity 44 (3.8%) 358 (30.3%) 60 (5.4%) 5 (0.5%) 467 (10.3%)
Lightweight high thermal conductivity 195 (16.8%) 728 (61.7%) 628 (56.8%) 701 (63.7%) 2252 (49.5%)
Heavyweight high thermal conductivity 809 (69.8%) 60 (5.1%) 34 (3.1%) 395 (35.9%) 1298 (28.6%)
Heavyweight low thermal conductivity 87 (7.5%) 34 (2.9%) 370 (33.5%) 0 (0%) 491 (10.8%)
Don't know 14 (1.2%) 0 (0%) 13 (1.2%) 0 (0%) 27 (0.6%)
Refused 10 (0.9%) 0 (0%) 0 (0%) 0 (0%) 10 (0.2%)
Windows
0 3 (0.3%) 14 (1.2%) 3 (0.3%) 2 (0.2%) 22 (0.5%)
1 262 (22.6%) 527 (44.7%) 129 (11.7%) 99 (9.0%) 1017 (22.4%)
2 688 (59.4%) 613 (51.9%) 385 (34.8%) 403 (36.6%) 2089 (46.0%)
3 161 (13.9%) 19 (1.6%) 298 (27.0%) 283 (25.7%) 761 (16.7%)
4 27 (2.3%) 7 (0.6%) 151 (13.7%) 152 (13.8%) 337 (7.4%)
5 5 (0.4%) 0 (0%) 44 (4.0%) 102 (9.3%) 151 (3.3%)
6 11 (0.9%) 0 (0%) 43 (3.9%) 58 (5.3%) 112 (2.5%)
7 1 (0.1%) 0 (0%) 10 (0.9%) 2 (0.2%) 13 (0.3%)
8 0 (0%) 0 (0%) 18 (1.6%) 0 (0%) 18 (0.4%)
9 1 (0.1%) 0 (0%) 4 (0.4%) 0 (0%) 5 (0.1%)
10 0 (0%) 0 (0%) 20 (1.8%) 0 (0%) 20 (0.4%)

Regression analysis

WallTherm

Pakistan

Standard model

library(tidyverse)
library(jtools)
library(kableExtra)
library(tidyverse)

newnexus<-filter(newnexus, walltherm != "Don't know") %>% 
  filter(walltherm != "Refused") %>%
  filter(rooftherm != "Refused") %>% 
  filter(rooftherm != "Don't know") %>% 
  mutate(TemperatureInsideHomeCat = recode(TemperatureInsideHome,

                                          "Very hot" = "Hot",

                                          "Hot" = "Hot",

                                          "Warm" = "Hot",

                                          "Slightly warm" = "Hot",

                                          "Comfortable" = "Cold",

                                          "Slightly cool" = "Cold",

                                          "Cool" = "Cold",

                                          "Cold" =  "Cold")) 

newnexus$TemperatureInsideHome <- relevel(newnexus$TemperatureInsideHome, ref = "Cold")

newnexus<-newnexus %>% 
  filter(TemperatureInsideHomeCat != "Don't know") %>% 
  filter(TemperatureInsideHomeCat != "Refused") 

unique(newnexus$TemperatureInsideHomeCat)
## [1] Cold Hot 
## Levels: Hot Cold Don't know Refused
summary(newnexus$TemperatureInsideHomeCat)
##        Hot       Cold Don't know    Refused 
##       3102       1343          0          0
newnexus <- mutate(newnexus, NormallyDo_Coded = recode(NormallyDo_Coded,
                                                        "Do nothing specific" = "Do nothing",
                                                        "Go outside + Sit under tree" = "Go outside",
                                                        "Unclear" = "Do nothing",
                                                        "Use manual fan/cooling device" = "Use fan",
                                                        "Use cooler" = "Add ventilation",
                                                        "Drink cold drink" = "Drink something",
                                                        "Drink water" = "Drink something",
                                                        "Undress" = "Other",
                                                        "Go outside + Use fan" = "Use fan", 
                                                        "Add ventilation + Go outside" = "Add ventilation",
                                                        "Take bath/shower + Use fan" = "Use fan",
                                                        "Take bath/shower + Go outside" = "Go outside"
  ))

newnexus<-filter(newnexus, NormallyDo_Coded == "Do nothing" | NormallyDo_Coded == "Go outside" | NormallyDo_Coded == "Use fan" | NormallyDo_Coded =="Add ventilation"| NormallyDo_Coded =="Drink something" | NormallyDo_Coded =="Take bath/shower")

newnexus<-newnexus %>% 
  mutate(floortherm = recode(FloorMaterial,

                                          "ASPHALTED FLOOR" = "Heavyweight high thermal conductivity",

                                          "CEMENT" = "Heavyweight high thermal conductivity",

                                          "CERAMIC TILES" = "Heavyweight low thermal conductivity",

                                          "CLAY COURT" = "Heavyweight low thermal conductivity",

                                          "OTHER" = "Other",

                                          "SAND/DIRT" = "Lightweight low thermal conductivity",

                                          "WOOD/BAMBOO" = "Lightweight low thermal conductivity",

                                          "CLAY COAT" =  "Heavyweight low thermal conductivity",
                                "DON'T KNOW" = "Other"))

test<- newnexus %>% 
  group_by(NormallyDo_Coded) %>% 
  count() %>% 
  arrange(-n)

kable(test)
NormallyDo_Coded n
Use fan 1639
Go outside 903
Add ventilation 742
Do nothing 419
Take bath/shower 325
Drink something 76
PakistanModel<-filter(newnexus, Country == "Pakistan")

Model1 <- glm(TemperatureInsideHomeCat ~ walltherm, data = PakistanModel, family = binomial())
summ(Model1)
Observations 997
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(2) 1.25
Pseudo-R² (Cragg-Uhler) 0.00
Pseudo-R² (McFadden) 0.00
AIC 599.97
BIC 614.69
Est. S.E. z val. p
(Intercept) -2.64 1.04 -2.55 0.01
wallthermHeavyweight low thermal conductivity 0.15 1.05 0.14 0.89
wallthermHeavyweight high thermal conductivity 0.40 1.04 0.38 0.70
Standard errors: MLE

Standard model + cooling practices + temperature outside home + Windows + Electricity + Water

Model5 <- glm(TemperatureInsideHomeCat ~ walltherm  + TemperatureOutsideHome + Electricity + DrinkingWater + Gender 
, data = PakistanModel, family = binomial())
summ(Model5)
Observations 997
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(16) 99.99
Pseudo-R² (Cragg-Uhler) 0.21
Pseudo-R² (McFadden) 0.17
AIC 529.23
BIC 612.61
Est. S.E. z val. p
(Intercept) -4.87 1.25 -3.89 0.00
wallthermHeavyweight low thermal conductivity 0.32 1.13 0.28 0.78
wallthermHeavyweight high thermal conductivity 0.54 1.13 0.47 0.64
TemperatureOutsideHomeVery difficult to tolerate 0.57 0.54 1.05 0.29
TemperatureOutsideHomeFairly difficult to tolerate 2.03 0.46 4.37 0.00
TemperatureOutsideHomeSlightly difficult to tolerate 2.08 0.48 4.34 0.00
TemperatureOutsideHomePerfectly tolerable 3.41 0.53 6.48 0.00
TemperatureOutsideHomeDon’t know 4.87 1.32 3.69 0.00
TemperatureOutsideHomeRefused 2.37 4043.07 0.00 1.00
ElectricityGenerator 0.60 1.10 0.54 0.59
Electricity12-volt battery 1.33 0.43 3.09 0.00
ElectricityInformal connection 0.75 0.33 2.31 0.02
ElectricityOther -15.03 833.71 -0.02 0.99
DrinkingWatershared tap -0.31 0.28 -1.09 0.28
DrinkingWatersupplied in tanks -0.58 0.32 -1.81 0.07
DrinkingWaterother -1.96 1.15 -1.70 0.09
GenderMale 0.29 0.25 1.19 0.24
Standard errors: MLE

India

Standard model

IndiaModel<-filter(newnexus, Country == "India")

Model2 <- glm(TemperatureInsideHomeCat ~ walltherm, data = IndiaModel, family = binomial())
summ(Model2)
Observations 1156
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(2) 0.03
Pseudo-R² (Cragg-Uhler) 0.00
Pseudo-R² (McFadden) 0.00
AIC 1321.25
BIC 1336.40
Est. S.E. z val. p
(Intercept) -1.08 0.09 -11.75 0.00
wallthermHeavyweight low thermal conductivity 0.02 0.14 0.16 0.87
wallthermHeavyweight high thermal conductivity -0.00 0.30 -0.01 0.99
Standard errors: MLE

Standard model + cooling practices + temperature outside home

Model5 <- glm(TemperatureInsideHomeCat ~ walltherm + NormallyDo_Coded + TemperatureOutsideHome + DrinkingWater + Gender + SpendAtHome + Windows , data = IndiaModel, family = binomial())
summ(Model5)
Observations 1156
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(22) 320.67
Pseudo-R² (Cragg-Uhler) 0.36
Pseudo-R² (McFadden) 0.24
AIC 1040.61
BIC 1156.82
Est. S.E. z val. p
(Intercept) -1.14 1.79 -0.64 0.52
wallthermHeavyweight low thermal conductivity -0.16 0.17 -0.96 0.34
wallthermHeavyweight high thermal conductivity 0.33 0.37 0.91 0.36
NormallyDo_CodedDo nothing -14.62 1037.55 -0.01 0.99
NormallyDo_CodedGo outside 0.16 0.35 0.46 0.65
NormallyDo_CodedUse fan 0.62 0.34 1.82 0.07
TemperatureOutsideHomeVery difficult to tolerate 0.31 0.42 0.74 0.46
TemperatureOutsideHomeFairly difficult to tolerate -0.90 0.41 -2.19 0.03
TemperatureOutsideHomeSlightly difficult to tolerate -1.72 0.42 -4.07 0.00
TemperatureOutsideHomePerfectly tolerable -2.17 0.72 -3.03 0.00
TemperatureOutsideHomeDon’t know -0.68 1.22 -0.56 0.58
DrinkingWatershared tap -0.44 1.55 -0.29 0.77
DrinkingWatersupplied in tanks 0.09 1.55 0.06 0.95
DrinkingWaterother -0.38 2.11 -0.18 0.86
GenderMale -0.02 0.17 -0.10 0.92
SpendAtHomeSome of the day -0.47 0.30 -1.55 0.12
SpendAtHomeOther -15.92 638.54 -0.02 0.98
SpendAtHomeVery little – only for sleeping -1.22 0.23 -5.28 0.00
SpendAtHomeMost of the day – except for short trips out -0.18 0.40 -0.46 0.65
Windows1 0.95 0.84 1.12 0.26
Windows2 1.04 0.84 1.23 0.22
Windows3 1.70 1.01 1.68 0.09
Windows4 1.69 1.27 1.32 0.19
Standard errors: MLE

Indonesia

Standard model

IndonesiaModel<-filter(newnexus, Country == "Indonesia")

Model3 <- glm(TemperatureInsideHomeCat ~ walltherm, data = IndonesiaModel, family = binomial())
summ(Model3)
Observations 903
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(2) 5.67
Pseudo-R² (Cragg-Uhler) 0.01
Pseudo-R² (McFadden) 0.01
AIC 1120.14
BIC 1134.55
Est. S.E. z val. p
(Intercept) -0.23 0.31 -0.76 0.45
wallthermHeavyweight low thermal conductivity -0.51 0.32 -1.58 0.11
wallthermHeavyweight high thermal conductivity -0.74 0.33 -2.23 0.03
Standard errors: MLE

Standard model + cooling practices + temperature outside home

Model5 <- glm(TemperatureInsideHomeCat ~ walltherm + NormallyDo_Coded + TemperatureOutsideHome + Gender + Rooms + Windows , data = IndonesiaModel, family = binomial())
summ(Model5)
Observations 903
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(25) 69.28
Pseudo-R² (Cragg-Uhler) 0.10
Pseudo-R² (McFadden) 0.06
AIC 1102.52
BIC 1227.47
Est. S.E. z val. p
(Intercept) -0.13 1.36 -0.10 0.92
wallthermHeavyweight low thermal conductivity -0.65 0.34 -1.91 0.06
wallthermHeavyweight high thermal conductivity -0.94 0.35 -2.66 0.01
NormallyDo_CodedDo nothing 0.42 0.71 0.59 0.56
NormallyDo_CodedDrink something -13.19 502.88 -0.03 0.98
NormallyDo_CodedGo outside -0.09 0.28 -0.31 0.76
NormallyDo_CodedTake bath/shower 0.41 0.34 1.19 0.23
NormallyDo_CodedUse fan 0.28 0.21 1.35 0.18
TemperatureOutsideHomeVery difficult to tolerate -0.25 0.33 -0.76 0.45
TemperatureOutsideHomeFairly difficult to tolerate -0.58 0.30 -1.91 0.06
TemperatureOutsideHomeSlightly difficult to tolerate -0.24 0.29 -0.84 0.40
TemperatureOutsideHomePerfectly tolerable 0.43 0.27 1.58 0.11
TemperatureOutsideHomeDon’t know 0.80 0.56 1.42 0.16
TemperatureOutsideHomeRefused -13.50 882.74 -0.02 0.99
GenderMale 0.16 0.15 1.04 0.30
Rooms -0.15 0.13 -1.21 0.23
Windows1 -0.12 1.32 -0.09 0.93
Windows2 -0.21 1.31 -0.16 0.87
Windows3 0.23 1.31 0.17 0.86
Windows4 0.28 1.31 0.22 0.83
Windows5 0.66 1.35 0.49 0.62
Windows6 1.29 1.35 0.96 0.34
Windows7 2.01 1.58 1.27 0.20
Windows8 -0.81 1.52 -0.53 0.59
Windows9 15.80 622.04 0.03 0.98
Windows10 -0.32 1.45 -0.22 0.82
Standard errors: MLE

Cameroon

Standard Model

CameroonModel<-filter(newnexus, Country == "Cameroon")

Model4 <- glm(TemperatureInsideHomeCat ~ walltherm, data = CameroonModel, family = binomial())
summ(Model4)
Observations 1048
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(2) 16.71
Pseudo-R² (Cragg-Uhler) 0.02
Pseudo-R² (McFadden) 0.01
AIC 1427.89
BIC 1442.76
Est. S.E. z val. p
(Intercept) 0.25 0.13 1.91 0.06
wallthermHeavyweight low thermal conductivity -0.62 0.21 -2.94 0.00
wallthermHeavyweight high thermal conductivity 0.11 0.15 0.74 0.46
Standard errors: MLE

Standard model + cooling practices + temperature outside home + Windows + Electricity + Water + Time at home

Model5 <- glm(TemperatureInsideHomeCat ~ walltherm + NormallyDo_Coded + TemperatureOutsideHome + Electricity + DrinkingWater + Gender + SpendAtHome, data = CameroonModel, family = binomial())
summ(Model5)
Observations 1048
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(20) 529.23
Pseudo-R² (Cragg-Uhler) 0.53
Pseudo-R² (McFadden) 0.37
AIC 951.37
BIC 1055.42
Est. S.E. z val. p
(Intercept) -3.03 1.66 -1.83 0.07
wallthermHeavyweight low thermal conductivity 0.16 0.29 0.53 0.59
wallthermHeavyweight high thermal conductivity 0.19 0.22 0.88 0.38
NormallyDo_CodedDo nothing 1.84 0.24 7.55 0.00
NormallyDo_CodedDrink something 3.17 1.12 2.83 0.00
NormallyDo_CodedGo outside 2.96 0.30 10.01 0.00
NormallyDo_CodedTake bath/shower 1.80 0.36 5.03 0.00
NormallyDo_CodedUse fan 2.82 0.25 11.16 0.00
TemperatureOutsideHomeVery difficult to tolerate 0.85 0.48 1.77 0.08
TemperatureOutsideHomeFairly difficult to tolerate 2.07 0.44 4.70 0.00
TemperatureOutsideHomeSlightly difficult to tolerate 1.96 0.43 4.59 0.00
TemperatureOutsideHomePerfectly tolerable 3.99 0.47 8.46 0.00
ElectricityInformal connection 0.50 1.54 0.33 0.74
ElectricityOther 0.57 1.56 0.36 0.72
DrinkingWatershared tap -0.25 0.43 -0.58 0.56
DrinkingWatersupplied in tanks 0.23 0.72 0.32 0.75
GenderMale -0.08 0.18 -0.43 0.66
SpendAtHomeSome of the day -1.43 0.28 -5.03 0.00
SpendAtHomeOther 0.46 1.04 0.44 0.66
SpendAtHomeVery little – only for sleeping -0.18 0.27 -0.66 0.51
SpendAtHomeMost of the day – except for short trips out -0.91 0.32 -2.87 0.00
Standard errors: MLE

RoofTherm

Pakistan

Standard model

library(tidyverse)
library(jtools)

newnexus<-filter(newnexus, walltherm != "Don't know") %>% 
  filter(walltherm != "Refused") %>%
  filter(rooftherm != "Refused") %>% 
  filter(rooftherm != "Don't know") %>% 
  mutate(TemperatureInsideHomeCat = recode(TemperatureInsideHome,

                                          "Very hot" = "Hot",

                                          "Hot" = "Hot",

                                          "Warm" = "Hot",

                                          "Slightly warm" = "Hot",

                                          "Comfortable" = "Cold",

                                          "Slightly cool" = "Cold",

                                          "Cool" = "Cold",

                                          "Cold" =  "Cold")) 
newnexus$TemperatureInsideHome <- relevel(newnexus$TemperatureInsideHome, ref = "Cold")

newnexus<-newnexus %>% 
  filter(TemperatureInsideHomeCat != "Don't know") %>% 
  filter(TemperatureInsideHomeCat != "Refused") 

PakistanModel<-filter(newnexus, Country == "Pakistan")

Model1 <- glm(TemperatureInsideHomeCat ~ rooftherm, data = PakistanModel, family = binomial())
summ(Model1)
Observations 997
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(3) 4.44
Pseudo-R² (Cragg-Uhler) 0.01
Pseudo-R² (McFadden) 0.01
AIC 598.77
BIC 618.39
Est. S.E. z val. p
(Intercept) 2.97 0.72 4.10 0.00
roofthermLightweight high thermal conductivity -0.61 0.77 -0.79 0.43
roofthermHeavyweight high thermal conductivity -0.58 0.74 -0.79 0.43
roofthermHeavyweight low thermal conductivity -1.25 0.79 -1.58 0.11
Standard errors: MLE

Standard model + 529

Model10 <- glm(TemperatureInsideHomeCat ~ rooftherm  + TemperatureOutsideHome + Electricity + DrinkingWater + Gender + NormallyDo_Coded + People_in_House 
, data = PakistanModel, family = binomial())
summ(Model10)
Observations 997
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(23) 106.25
Pseudo-R² (Cragg-Uhler) 0.22
Pseudo-R² (McFadden) 0.18
AIC 536.96
BIC 654.68
Est. S.E. z val. p
(Intercept) 4.96 1.20 4.15 0.00
roofthermLightweight high thermal conductivity -0.84 0.83 -1.01 0.31
roofthermHeavyweight high thermal conductivity -0.56 0.78 -0.72 0.47
roofthermHeavyweight low thermal conductivity -1.38 0.86 -1.61 0.11
TemperatureOutsideHomeVery difficult to tolerate -0.56 0.54 -1.03 0.31
TemperatureOutsideHomeFairly difficult to tolerate -2.08 0.47 -4.46 0.00
TemperatureOutsideHomeSlightly difficult to tolerate -2.11 0.48 -4.38 0.00
TemperatureOutsideHomePerfectly tolerable -3.52 0.53 -6.60 0.00
TemperatureOutsideHomeDon’t know -4.58 1.33 -3.46 0.00
TemperatureOutsideHomeRefused -2.23 4044.02 -0.00 1.00
ElectricityGenerator -0.50 1.13 -0.44 0.66
Electricity12-volt battery -1.15 0.43 -2.68 0.01
ElectricityInformal connection -0.81 0.33 -2.45 0.01
ElectricityOther 14.85 838.28 0.02 0.99
DrinkingWatershared tap 0.31 0.29 1.06 0.29
DrinkingWatersupplied in tanks 0.59 0.33 1.78 0.08
DrinkingWaterother 1.99 1.16 1.72 0.09
GenderMale -0.37 0.26 -1.46 0.14
NormallyDo_CodedDo nothing -0.19 0.69 -0.27 0.78
NormallyDo_CodedDrink something -0.37 0.81 -0.46 0.65
NormallyDo_CodedGo outside 0.01 0.70 0.02 0.98
NormallyDo_CodedTake bath/shower -0.29 0.69 -0.41 0.68
NormallyDo_CodedUse fan 0.00 0.69 0.01 1.00
People_in_House 0.05 0.06 0.98 0.33
Standard errors: MLE

India

standard model

IndiaModel<-filter(newnexus, Country == "India")

Model2 <- glm(TemperatureInsideHomeCat ~ rooftherm, data = IndiaModel, family = binomial())
summ(Model2)
Observations 1156
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(3) 1.29
Pseudo-R² (Cragg-Uhler) 0.00
Pseudo-R² (McFadden) 0.00
AIC 1321.98
BIC 1342.19
Est. S.E. z val. p
(Intercept) 1.17 0.13 9.33 0.00
roofthermLightweight high thermal conductivity -0.16 0.15 -1.03 0.30
roofthermHeavyweight high thermal conductivity -0.18 0.32 -0.58 0.56
roofthermHeavyweight low thermal conductivity 0.06 0.45 0.13 0.89
Standard errors: MLE

standard model + 1041

Model11 <- glm(TemperatureInsideHomeCat ~ rooftherm  + TemperatureOutsideHome + DrinkingWater + Gender + NormallyDo_Coded + SpendAtHome
, data = IndiaModel, family = binomial())
summ(Model11)
Observations 1156
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(19) 318.04
Pseudo-R² (Cragg-Uhler) 0.35
Pseudo-R² (McFadden) 0.24
AIC 1037.23
BIC 1138.29
Est. S.E. z val. p
(Intercept) 0.50 1.57 0.31 0.75
roofthermLightweight high thermal conductivity -0.29 0.18 -1.62 0.11
roofthermHeavyweight high thermal conductivity -0.53 0.38 -1.39 0.16
roofthermHeavyweight low thermal conductivity -0.12 0.53 -0.22 0.82
TemperatureOutsideHomeVery difficult to tolerate -0.39 0.42 -0.93 0.35
TemperatureOutsideHomeFairly difficult to tolerate 0.81 0.42 1.94 0.05
TemperatureOutsideHomeSlightly difficult to tolerate 1.63 0.43 3.81 0.00
TemperatureOutsideHomePerfectly tolerable 2.15 0.72 2.99 0.00
TemperatureOutsideHomeDon’t know 0.63 1.23 0.51 0.61
DrinkingWatershared tap 0.32 1.52 0.21 0.83
DrinkingWatersupplied in tanks -0.24 1.52 -0.16 0.87
DrinkingWaterother 0.28 2.10 0.13 0.90
GenderMale 0.05 0.17 0.29 0.77
NormallyDo_CodedDo nothing 14.82 1017.11 0.01 0.99
NormallyDo_CodedGo outside 0.01 0.34 0.04 0.97
NormallyDo_CodedUse fan -0.51 0.33 -1.57 0.12
SpendAtHomeSome of the day 0.48 0.30 1.61 0.11
SpendAtHomeOther 15.95 642.33 0.02 0.98
SpendAtHomeVery little – only for sleeping 1.20 0.23 5.19 0.00
SpendAtHomeMost of the day – except for short trips out 0.16 0.40 0.40 0.69
Standard errors: MLE

Indonesia

standard model

IndonesiaModel<-filter(newnexus, Country == "Indonesia")

Model3 <- glm(TemperatureInsideHomeCat ~ rooftherm, data = IndonesiaModel, family = binomial())
summ(Model3)
Observations 903
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(3) 0.71
Pseudo-R² (Cragg-Uhler) 0.00
Pseudo-R² (McFadden) 0.00
AIC 1127.09
BIC 1146.32
Est. S.E. z val. p
(Intercept) 0.98 0.34 2.90 0.00
roofthermLightweight high thermal conductivity -0.18 0.35 -0.51 0.61
roofthermHeavyweight high thermal conductivity 0.02 0.56 0.03 0.97
roofthermHeavyweight low thermal conductivity -0.24 0.36 -0.66 0.51
Standard errors: MLE

Standard model + 1102

Model12 <- glm(TemperatureInsideHomeCat ~ rooftherm  + TemperatureOutsideHome + Electricity + DrinkingWater + Gender + NormallyDo_Coded + SpendAtHome + Windows + People_in_House 
, data = IndonesiaModel, family = binomial())
summ(Model12)
Observations 903
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(36) 75.76
Pseudo-R² (Cragg-Uhler) 0.11
Pseudo-R² (McFadden) 0.07
AIC 1118.05
BIC 1295.86
Est. S.E. z val. p
(Intercept) 15.71 707.49 0.02 0.98
roofthermLightweight high thermal conductivity -0.08 0.38 -0.21 0.83
roofthermHeavyweight high thermal conductivity 0.13 0.60 0.21 0.83
roofthermHeavyweight low thermal conductivity -0.19 0.39 -0.48 0.63
TemperatureOutsideHomeVery difficult to tolerate 0.12 0.33 0.35 0.72
TemperatureOutsideHomeFairly difficult to tolerate 0.51 0.31 1.65 0.10
TemperatureOutsideHomeSlightly difficult to tolerate 0.14 0.29 0.47 0.64
TemperatureOutsideHomePerfectly tolerable -0.54 0.28 -1.96 0.05
TemperatureOutsideHomeDon’t know -0.89 0.57 -1.56 0.12
TemperatureOutsideHomeRefused 14.42 1455.40 0.01 0.99
ElectricityInformal connection -14.78 707.49 -0.02 0.98
ElectricityOther -14.89 707.49 -0.02 0.98
DrinkingWatershared tap 0.15 0.23 0.66 0.51
DrinkingWatersupplied in tanks 0.48 0.90 0.53 0.60
DrinkingWaterother 0.34 0.23 1.50 0.13
GenderMale -0.15 0.16 -0.94 0.35
NormallyDo_CodedDo nothing -0.49 0.71 -0.69 0.49
NormallyDo_CodedDrink something 14.14 833.71 0.02 0.99
NormallyDo_CodedGo outside 0.08 0.29 0.28 0.78
NormallyDo_CodedTake bath/shower -0.30 0.35 -0.88 0.38
NormallyDo_CodedUse fan -0.23 0.21 -1.11 0.27
SpendAtHomeSome of the day -0.64 0.41 -1.57 0.12
SpendAtHomeOther 1.39 1.11 1.25 0.21
SpendAtHomeDon’t know -15.36 1455.40 -0.01 0.99
SpendAtHomeVery little – only for sleeping -0.04 0.20 -0.20 0.84
SpendAtHomeMost of the day – except for short trips out 0.23 0.18 1.27 0.20
Windows1 0.41 1.29 0.32 0.75
Windows2 0.52 1.28 0.41 0.68
Windows3 0.18 1.28 0.14 0.89
Windows4 0.07 1.28 0.05 0.96
Windows5 -0.24 1.33 -0.18 0.85
Windows6 -0.80 1.32 -0.61 0.54
Windows7 -1.52 1.56 -0.97 0.33
Windows8 1.32 1.49 0.88 0.38
Windows9 -15.79 1024.22 -0.02 0.99
Windows10 0.83 1.42 0.58 0.56
People_in_House -0.03 0.05 -0.54 0.59
Standard errors: MLE

Cameroon

standard model

CameroonModel<-filter(newnexus, Country == "Cameroon")

Model4 <- glm(TemperatureInsideHomeCat ~ rooftherm, data = CameroonModel, family = binomial())
summ(Model4)
Observations 1048
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(2) 1.37
Pseudo-R² (Cragg-Uhler) 0.00
Pseudo-R² (McFadden) 0.00
AIC 1443.23
BIC 1458.10
Est. S.E. z val. p
(Intercept) 0.41 0.91 0.44 0.66
roofthermLightweight high thermal conductivity -0.60 0.92 -0.65 0.51
roofthermHeavyweight high thermal conductivity -0.72 0.92 -0.78 0.43
Standard errors: MLE

standard model + 950

Model13 <- glm(TemperatureInsideHomeCat ~ rooftherm  + TemperatureOutsideHome + Gender + NormallyDo_Coded + SpendAtHome + Windows 
, data = CameroonModel, family = binomial())
summ(Model13)
Observations 1048
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(23) 542.40
Pseudo-R² (Cragg-Uhler) 0.54
Pseudo-R² (McFadden) 0.38
AIC 944.20
BIC 1063.11
Est. S.E. z val. p
(Intercept) 18.09 523.14 0.03 0.97
roofthermLightweight high thermal conductivity -0.98 1.15 -0.85 0.39
roofthermHeavyweight high thermal conductivity -0.88 1.15 -0.76 0.45
TemperatureOutsideHomeVery difficult to tolerate -0.83 0.49 -1.70 0.09
TemperatureOutsideHomeFairly difficult to tolerate -2.08 0.45 -4.63 0.00
TemperatureOutsideHomeSlightly difficult to tolerate -1.93 0.43 -4.44 0.00
TemperatureOutsideHomePerfectly tolerable -3.99 0.48 -8.34 0.00
GenderMale 0.11 0.18 0.59 0.55
NormallyDo_CodedDo nothing -1.57 0.31 -5.15 0.00
NormallyDo_CodedDrink something -3.12 1.11 -2.79 0.01
NormallyDo_CodedGo outside -3.03 0.29 -10.42 0.00
NormallyDo_CodedTake bath/shower -1.83 0.36 -5.13 0.00
NormallyDo_CodedUse fan -2.78 0.24 -11.36 0.00
SpendAtHomeSome of the day 1.38 0.29 4.82 0.00
SpendAtHomeOther -0.55 1.07 -0.51 0.61
SpendAtHomeVery little – only for sleeping 0.12 0.27 0.44 0.66
SpendAtHomeMost of the day – except for short trips out 0.80 0.32 2.49 0.01
Windows1 -14.69 523.14 -0.03 0.98
Windows2 -14.31 523.14 -0.03 0.98
Windows3 -14.48 523.14 -0.03 0.98
Windows4 -14.63 523.14 -0.03 0.98
Windows5 -15.02 523.14 -0.03 0.98
Windows6 -15.42 523.14 -0.03 0.98
Windows7 -28.06 809.99 -0.03 0.97
Standard errors: MLE

FloorTherm

Pakistan

Model5 <- glm(TemperatureInsideHomeCat ~ floortherm  + TemperatureOutsideHome + Electricity + DrinkingWater + Gender 
, data = PakistanModel, family = binomial())
summ(Model5)
Observations 997
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(17) 104.15
Pseudo-R² (Cragg-Uhler) 0.22
Pseudo-R² (McFadden) 0.17
AIC 527.07
BIC 615.36
Est. S.E. z val. p
(Intercept) 4.47 0.55 8.10 0.00
floorthermHeavyweight low thermal conductivity -0.19 0.32 -0.59 0.55
floorthermOther 16.00 3956.18 0.00 1.00
floorthermLightweight low thermal conductivity 1.33 0.81 1.64 0.10
TemperatureOutsideHomeVery difficult to tolerate -0.63 0.54 -1.17 0.24
TemperatureOutsideHomeFairly difficult to tolerate -2.08 0.46 -4.49 0.00
TemperatureOutsideHomeSlightly difficult to tolerate -2.06 0.48 -4.29 0.00
TemperatureOutsideHomePerfectly tolerable -3.45 0.52 -6.58 0.00
TemperatureOutsideHomeDon’t know -5.16 1.39 -3.72 0.00
TemperatureOutsideHomeRefused -2.63 4042.49 -0.00 1.00
ElectricityGenerator -0.56 1.10 -0.51 0.61
Electricity12-volt battery -1.18 0.42 -2.81 0.00
ElectricityInformal connection -0.81 0.33 -2.48 0.01
ElectricityOther 15.17 830.88 0.02 0.99
DrinkingWatershared tap 0.32 0.29 1.13 0.26
DrinkingWatersupplied in tanks 0.56 0.32 1.74 0.08
DrinkingWaterother 1.79 1.14 1.56 0.12
GenderMale -0.34 0.25 -1.36 0.17
Standard errors: MLE

India

Standard model + cooling practices + temperature outside home

Model5 <- glm(TemperatureInsideHomeCat ~ floortherm + NormallyDo_Coded + TemperatureOutsideHome + DrinkingWater + Gender + SpendAtHome + Windows , data = IndiaModel, family = binomial())
summ(Model5)
Observations 1156
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(23) 318.95
Pseudo-R² (Cragg-Uhler) 0.35
Pseudo-R² (McFadden) 0.24
AIC 1044.33
BIC 1165.59
Est. S.E. z val. p
(Intercept) 1.05 1.79 0.59 0.56
floorthermHeavyweight low thermal conductivity 0.01 0.18 0.05 0.96
floorthermOther 0.81 1.22 0.66 0.51
floorthermLightweight low thermal conductivity 0.04 0.28 0.15 0.88
NormallyDo_CodedDo nothing 14.67 1009.90 0.01 0.99
NormallyDo_CodedGo outside -0.04 0.34 -0.11 0.91
NormallyDo_CodedUse fan -0.52 0.33 -1.58 0.12
TemperatureOutsideHomeVery difficult to tolerate -0.34 0.42 -0.81 0.42
TemperatureOutsideHomeFairly difficult to tolerate 0.86 0.41 2.09 0.04
TemperatureOutsideHomeSlightly difficult to tolerate 1.67 0.42 3.95 0.00
TemperatureOutsideHomePerfectly tolerable 2.12 0.71 2.97 0.00
TemperatureOutsideHomeDon’t know 0.70 1.23 0.57 0.57
DrinkingWatershared tap 0.49 1.55 0.32 0.75
DrinkingWatersupplied in tanks -0.02 1.55 -0.01 0.99
DrinkingWaterother 0.44 2.12 0.21 0.84
GenderMale 0.01 0.17 0.09 0.93
SpendAtHomeSome of the day 0.47 0.30 1.58 0.11
SpendAtHomeOther 15.95 640.36 0.02 0.98
SpendAtHomeVery little – only for sleeping 1.22 0.23 5.30 0.00
SpendAtHomeMost of the day – except for short trips out 0.21 0.40 0.51 0.61
Windows1 -0.96 0.84 -1.14 0.25
Windows2 -1.02 0.84 -1.22 0.22
Windows3 -1.74 1.01 -1.72 0.08
Windows4 -1.75 1.28 -1.37 0.17
Standard errors: MLE

Indonesia

Standard model + cooling practices + temperature outside home

Model5 <- glm(TemperatureInsideHomeCat ~ floortherm + NormallyDo_Coded + TemperatureOutsideHome + Gender + Rooms + Windows , data = IndonesiaModel, family = binomial())
summ(Model5)
Observations 903
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(26) 63.62
Pseudo-R² (Cragg-Uhler) 0.10
Pseudo-R² (McFadden) 0.06
AIC 1110.18
BIC 1239.94
Est. S.E. z val. p
(Intercept) 0.50 1.32 0.38 0.71
floorthermHeavyweight low thermal conductivity 0.32 0.22 1.46 0.14
floorthermOther 0.09 0.85 0.10 0.92
floorthermLightweight low thermal conductivity 0.58 0.75 0.77 0.44
NormallyDo_CodedDo nothing -0.50 0.70 -0.72 0.47
NormallyDo_CodedDrink something 13.24 505.12 0.03 0.98
NormallyDo_CodedGo outside 0.06 0.28 0.21 0.84
NormallyDo_CodedTake bath/shower -0.41 0.34 -1.19 0.24
NormallyDo_CodedUse fan -0.30 0.20 -1.46 0.15
TemperatureOutsideHomeVery difficult to tolerate 0.21 0.33 0.64 0.52
TemperatureOutsideHomeFairly difficult to tolerate 0.57 0.30 1.89 0.06
TemperatureOutsideHomeSlightly difficult to tolerate 0.26 0.29 0.89 0.37
TemperatureOutsideHomePerfectly tolerable -0.45 0.27 -1.66 0.10
TemperatureOutsideHomeDon’t know -0.81 0.56 -1.44 0.15
TemperatureOutsideHomeRefused 13.64 882.74 0.02 0.99
GenderMale -0.20 0.15 -1.28 0.20
Rooms 0.14 0.12 1.15 0.25
Windows1 0.26 1.28 0.21 0.84
Windows2 0.35 1.27 0.27 0.78
Windows3 -0.06 1.27 -0.05 0.96
Windows4 -0.19 1.27 -0.15 0.88
Windows5 -0.53 1.31 -0.40 0.69
Windows6 -1.09 1.31 -0.83 0.41
Windows7 -1.79 1.55 -1.16 0.25
Windows8 0.88 1.49 0.59 0.55
Windows9 -15.48 622.12 -0.02 0.98
Windows10 0.52 1.42 0.37 0.71
Standard errors: MLE

Cameroon

Standard model + cooling practices + temperature outside home + Windows + Electricity + Water + Time at home

Model5 <- glm(TemperatureInsideHomeCat ~ floortherm + NormallyDo_Coded + TemperatureOutsideHome + Electricity + DrinkingWater + Gender + SpendAtHome, data = CameroonModel, family = binomial())
summ(Model5)
Observations 1048
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(21) 529.62
Pseudo-R² (Cragg-Uhler) 0.53
Pseudo-R² (McFadden) 0.37
AIC 952.98
BIC 1061.99
Est. S.E. z val. p
(Intercept) 2.61 1.92 1.36 0.17
floorthermHeavyweight low thermal conductivity 0.64 1.73 0.37 0.71
floorthermOther 11.58 535.41 0.02 0.98
floorthermLightweight low thermal conductivity 0.24 0.27 0.88 0.38
NormallyDo_CodedDo nothing -1.83 0.24 -7.67 0.00
NormallyDo_CodedDrink something -3.12 1.12 -2.79 0.01
NormallyDo_CodedGo outside -2.96 0.29 -10.18 0.00
NormallyDo_CodedTake bath/shower -1.83 0.37 -4.97 0.00
NormallyDo_CodedUse fan -2.74 0.25 -11.07 0.00
TemperatureOutsideHomeVery difficult to tolerate -0.86 0.48 -1.77 0.08
TemperatureOutsideHomeFairly difficult to tolerate -2.06 0.44 -4.68 0.00
TemperatureOutsideHomeSlightly difficult to tolerate -1.96 0.43 -4.58 0.00
TemperatureOutsideHomePerfectly tolerable -4.00 0.47 -8.46 0.00
ElectricityInformal connection -0.28 1.82 -0.15 0.88
ElectricityOther -0.34 1.84 -0.18 0.85
DrinkingWatershared tap 0.26 0.42 0.62 0.53
DrinkingWatersupplied in tanks -0.24 0.72 -0.33 0.74
GenderMale 0.07 0.18 0.40 0.69
SpendAtHomeSome of the day 1.43 0.28 5.04 0.00
SpendAtHomeOther -0.52 1.05 -0.49 0.62
SpendAtHomeVery little – only for sleeping 0.18 0.27 0.68 0.49
SpendAtHomeMost of the day – except for short trips out 0.92 0.32 2.91 0.00
Standard errors: MLE

Diagram of variable relationships

library(knitr)
include_graphics("Variable_diagram.png")

Testing

library(stringr)
library(rstatix)

ggplot(data = newnexus) +
  geom_bar(aes(x = rooftherm, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1) + theme(axis.text.x = element_text(angle = 45, vjust = 0.75))

newnexus %>% 
  group_by(Country, rooftherm) %>% 
  count()
## # A tibble: 15 x 3
## # Groups:   Country, rooftherm [15]
##    Country   rooftherm                                 n
##    <fct>     <fct>                                 <int>
##  1 Pakistan  Lightweight low thermal conductivity     41
##  2 Pakistan  Lightweight high thermal conductivity   186
##  3 Pakistan  Heavyweight high thermal conductivity   691
##  4 Pakistan  Heavyweight low thermal conductivity     79
##  5 India     Lightweight low thermal conductivity    351
##  6 India     Lightweight high thermal conductivity   715
##  7 India     Heavyweight high thermal conductivity    59
##  8 India     Heavyweight low thermal conductivity     31
##  9 Indonesia Lightweight low thermal conductivity     44
## 10 Indonesia Lightweight high thermal conductivity   510
## 11 Indonesia Heavyweight high thermal conductivity    26
## 12 Indonesia Heavyweight low thermal conductivity    323
## 13 Cameroon  Lightweight low thermal conductivity      5
## 14 Cameroon  Lightweight high thermal conductivity   664
## 15 Cameroon  Heavyweight high thermal conductivity   379
# Page 100
ggplot(data = newnexus) +
  geom_bar(aes(x = walltherm, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1)

newnexus %>% 
  group_by(Country, walltherm) %>% 
  count()
## # A tibble: 12 x 3
## # Groups:   Country, walltherm [12]
##    Country   walltherm                                 n
##    <fct>     <fct>                                 <int>
##  1 Pakistan  Lightweight low thermal conductivity     15
##  2 Pakistan  Heavyweight low thermal conductivity    391
##  3 Pakistan  Heavyweight high thermal conductivity   591
##  4 India     Lightweight low thermal conductivity    629
##  5 India     Heavyweight low thermal conductivity    460
##  6 India     Heavyweight high thermal conductivity    67
##  7 Indonesia Lightweight low thermal conductivity     43
##  8 Indonesia Heavyweight low thermal conductivity    539
##  9 Indonesia Heavyweight high thermal conductivity   321
## 10 Cameroon  Lightweight low thermal conductivity    229
## 11 Cameroon  Heavyweight low thermal conductivity    156
## 12 Cameroon  Heavyweight high thermal conductivity   663
newnexus<- filter(newnexus, floortherm != "Other")

ggplot(data = newnexus) +
  geom_bar(aes(x = floortherm, fill = Country)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  scale_fill_manual(values = cbPalette) +
  facet_wrap(facets = vars(Country), ncol = 1) + theme(axis.text.x = element_text(angle = 45, vjust = 0.75))

newnexus %>% 
  group_by(Country, floortherm) %>% 
  count()
## # A tibble: 12 x 3
## # Groups:   Country, floortherm [12]
##    Country   floortherm                                n
##    <fct>     <fct>                                 <int>
##  1 Pakistan  Heavyweight high thermal conductivity   733
##  2 Pakistan  Heavyweight low thermal conductivity    187
##  3 Pakistan  Lightweight low thermal conductivity     76
##  4 India     Heavyweight high thermal conductivity   533
##  5 India     Heavyweight low thermal conductivity    500
##  6 India     Lightweight low thermal conductivity    117
##  7 Indonesia Heavyweight high thermal conductivity   128
##  8 Indonesia Heavyweight low thermal conductivity    756
##  9 Indonesia Lightweight low thermal conductivity     10
## 10 Cameroon  Heavyweight high thermal conductivity   904
## 11 Cameroon  Heavyweight low thermal conductivity      3
## 12 Cameroon  Lightweight low thermal conductivity    140
cramer_v(newnexus$walltherm, newnexus$rooftherm)
## [1] 0.3355939
Model5 <- glm(TemperatureInsideHomeCat ~ Temperature, data = newnexus, family = binomial())
summ(Model5)
Observations 3992 (95 missing obs. deleted)
Dependent variable TemperatureInsideHomeCat
Type Generalized linear model
Family binomial
Link logit
χ²(1) 311.06
Pseudo-R² (Cragg-Uhler) 0.11
Pseudo-R² (McFadden) 0.06
AIC 4613.99
BIC 4626.58
Est. S.E. z val. p
(Intercept) -4.27 0.31 -13.79 0.00
Temperature 0.16 0.01 16.24 0.00
Standard errors: MLE
LS0tDQp0aXRsZTogIk5leHVzRGF0YSINCmF1dGhvcjogJzY4MDAyOTkyNCcNCmRhdGU6ICIyMS8wMS8yMDIyIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgICAgdG9jOiB0cnVlDQogICAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICAgIHRvY19kZXB0aDogNQ0KICAgICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpgYGANCg0KYGBge3IsIGNhY2hlID0gVFJVRX0NCiMgRm9ybWF0dGluZyBjaHVuaw0KDQojIENsZWFyIHdvcmtzcGFjZQ0Kcm0obGlzdCA9IGxzKCkpDQoNCiMgU3BlY2lmeSBsaWJyYXJpZXMNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkobmFuaWFyKQ0KDQojIFJlYWQgZGF0YSBmcm9tIHdlYg0KY2FtZXJvb25fcmVhZCA8LSByZWFkX2Nzdih1cmwoImh0dHBzOi8vZGF0YXNoYXJlLmVkLmFjLnVrL2JpdHN0cmVhbS9oYW5kbGUvMTAyODMvMzgwNC9IZWF0LUNvdmlkJTIwTmV4dXMlMjBTdXJ2ZXlfQ2FtZXJvb24uY3N2P3NlcXVlbmNlPTEmaXNBbGxvd2VkPXkiKSwgbl9tYXggPSAyMDAwKQ0KaW5kb25lc2lhX3JlYWQgPC0gcmVhZF9jc3YodXJsKCJodHRwczovL2RhdGFzaGFyZS5lZC5hYy51ay9iaXRzdHJlYW0vaGFuZGxlLzEwMjgzLzM4MDQvSGVhdC1Db3ZpZCUyME5leHVzJTIwU3VydmV5X0luZG9uZXNpYS5jc3Y/c2VxdWVuY2U9MiZpc0FsbG93ZWQ9eSIpLCBuX21heCA9IDIwMDApDQpwYWtpc3Rhbl9yZWFkIDwtIHJlYWRfY3N2KHVybCgiaHR0cHM6Ly9kYXRhc2hhcmUuZWQuYWMudWsvYml0c3RyZWFtL2hhbmRsZS8xMDI4My8zODA0L0hlYXQtQ292aWQlMjBOZXh1cyUyMFN1cnZleV9QYWtpc3Rhbi5jc3Y/c2VxdWVuY2U9MTQmaXNBbGxvd2VkPXkiKSwgbl9tYXggPSAyMDAwKQ0KaW5kaWFfcmVhZCA8LSByZWFkX2Nzdih1cmwoImh0dHBzOi8vZGF0YXNoYXJlLmVkLmFjLnVrL2JpdHN0cmVhbS9oYW5kbGUvMTAyODMvMzgwNC9IZWF0LUNvdmlkJTIwTmV4dXMlMjBTdXJ2ZXlfSW5kaWEuY3N2P3NlcXVlbmNlPTE1JmlzQWxsb3dlZD15IiksIG5fbWF4ID0gMjAwMCkNCg0KDQojIENyb3Agb2JqZWN0cw0KcGFraXN0YW5fY3JvcHBlZCA8LSBwYWtpc3Rhbl9yZWFkICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiUGFraXN0YW4iKQ0KDQoNCmluZGlhX2Nyb3BwZWQgPC0gaW5kaWFfcmVhZCAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkluZGlhIikNCg0KDQojIEdlbmVyYXRlIFItbGVnaWJsZSBuYW1lcw0KbmFtZXMoY2FtZXJvb25fcmVhZCkgPC0gc3RyX3JlcGxhY2VfYWxsKG5hbWVzKGNhbWVyb29uX3JlYWQpLCBjKCIgIiA9ICJfIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iID0gIl9vcl8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiA9ICIiKSkNCm5hbWVzKGluZG9uZXNpYV9yZWFkKSA8LSBzdHJfcmVwbGFjZV9hbGwobmFtZXMoaW5kb25lc2lhX3JlYWQpLCBjKCIgIiA9ICJfIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgPSAiX29yXyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyIgPSAiIikpDQpuYW1lcyhwYWtpc3Rhbl9jcm9wcGVkKSA8LSBzdHJfcmVwbGFjZV9hbGwobmFtZXMocGFraXN0YW5fY3JvcHBlZCksIGMoIiAiID0gIl8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgPSAiX29yXyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciID0gIiIpKQ0KbmFtZXMoaW5kaWFfY3JvcHBlZCkgPC0gc3RyX3JlcGxhY2VfYWxsKG5hbWVzKGluZGlhX2Nyb3BwZWQpLCBjKCIgIiA9ICJfIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iID0gIl9vcl8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiA9ICIiKSkNCg0KIyBUaWR5IG9iamVjdHMNCmNhbWVyb29uX2ZhY3RvcnMgPC0gYygiQ291bnRyeSIsICJMYW5ndWFnZSIsICJBZ3JlZSIsICJMaXR0b3JhbCIsICJHZW5kZXIiLCAiT2NjdXBhdGlvbiIsICJPY2N1cGF0aW9uX1RyYW5zbGF0ZWQiLCAiT2NjdXBhdGlvbl9Db2RlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICJPd25Ib3VzZSIsICJDb29sSG9tZSIsICJFbGVjdHJpY2l0eSIsICJEcmlua2luZ1dhdGVyIiwgIkhvdXNlaG9sZFB1cnBvc2VzIiwgIlJvb2ZpbmdNYXRlcmlhbCIsICJXYWxsTWF0ZXJpYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRmxvb3JNYXRlcmlhbCIsICJXaW5kb3dzIiwgIk5vcm1hbGx5RG8iLCAiTm9ybWFsbHlEb19UcmFuc2xhdGVkIiwgIk5vcm1hbGx5RG9fQ29kZWQiLCAiQWRkX3ZlbnRpbGF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkNhbnRfZ29fb3V0c2lkZV8oQ09WSURfcmVsYXRlZCkiLCAiQ2xlYW5fZmxvb3Jfd2l0aF93YXRlciIsICJEb19ub3RoaW5nX3NwZWNpZmljIiwgIkRyYXdfY3VydGFpbnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRHJpbmtfY29sZF9kcmluayIsICJEcmlua193YXJtX2RyaW5rIiwgIkRyaW5rX3dhdGVyIiwgIkdvX291dHNpZGUiLCAiU2l0X3VuZGVyX3RyZWUiLCAiU2xlZXBfb3V0c2lkZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJTbGVlcF9vcl9saWVfb25fZmxvb3IiLCAiU2xlZXBfb3JfcmVzdCIsICJTbW9rZSIsICJTdGF5X2F0X2hvbWUiLCAiVGFrZV9hX2JhdGhfb3Jfc2hvd2VyIiwgIlR1cm5fb2ZmX2xpZ2h0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJUdXJuX29uX3Bvd2VyX3NvdXJjZSIsICJVbmNsZWFyIiwgIlVuZHJlc3Nfb3JfY2hhbmdlX2Nsb3RoZXNfb3Jfd2V0X2Nsb3RoZXMiLCAiVXNlX2FfY29vbGVyIiwgIlVzZV9BQyIsICJVc2VfZmFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgIlVzZV9tYW51YWxfZmFuX29yX2Nvb2xpbmdfZGV2aWNlIiwgIlVzZV90YWxjdW1fcG93ZGVyIiwgIlBhbmRlbWljQ2hhbmdlIiwgIlllc1BhbmRlbWljQ2hhbmdlIiwgDQogICAgICAgICAgICAgICAgICAgICAgIlllc1BhbmRlbWljQ2hhbmdlX1RyYW5zbGF0ZWQiLCAiWWVzUGFuZGVtaWNDaGFuZ2VfUmVjb2RlZCIsICJTcGVuZEF0SG9tZSIsICJBbW91bnRPZlRpbWUiLCAiSW5jb21lIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkVhdGluZ0hhYml0cyIsICJXYXRlckludGFrZSIsICJFbGVjdHJpY2l0eVVzYWdlIiwgIkhlYWx0aFNlcnZpY2VzIiwgIkhvbWVXYXJtIiwgIlRlbXBlcmF0dXJlSW5zaWRlSG9tZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJUZW1wZXJhdHVyZU91dHNpZGVIb21lIiwgIkV4cGVyaWVuY2VfQmx1cnJlZF92aXNpb24iLCAiRXhwZXJpZW5jZV9DbGFtbXlfc2tpbiIsICJFeHBlcmllbmNlX0NvbmNlbnRyYXRpb25fbG9zcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0NvbmZ1c2lvbiIsICJFeHBlcmllbmNlX0NvbnZ1bHNpb25zIiwgIkV4cGVyaWVuY2VfRGl6emluZXNzIiwgIkV4cGVyaWVuY2VfRE9OVF9LTk9XIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VfRmFpbnRpbmdfW2JyaWVmX2xvc3Nfb2ZfY29uc2Npb3VzbmVzc10iLCAiRXhwZXJpZW5jZV9GYXRpZ3VlIiwgIkV4cGVyaWVuY2VfRmVlbGluZ19ob3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9GZWVsaW5nX2xpc3RsZXNzX29yX2xhY2tfb2ZfZW5nYWdlbWVudF93aXRoX3NvY2lhbF9hY3Rpdml0aWVzX29yX2ZhbWlseSIsICJFeHBlcmllbmNlX0ZlZWxpbmdfc3dlYXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VfRmVlbGluZ190aGlyc3R5IiwgIkV4cGVyaWVuY2VfSGVhZGFjaGUiLCAiRXhwZXJpZW5jZV9JcnJhdGlvbmFsX2JlaGF2aW91ciIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0xvc3Nfb2ZfY29uc2Npb3VzbmVzc19bZXh0ZW5zaXZlXSIsICJFeHBlcmllbmNlX011c2NsZV9jcmFtcHMiLCAiRXhwZXJpZW5jZV9NdXNjbGVfd2Vha25lc3MiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9OYXVzZWEiLCAiRXhwZXJpZW5jZV9Qb29yX3F1YWxpdHlfb2Zfc2xlZXAiLCAiRXhwZXJpZW5jZV9SYXNoIiwgIkV4cGVyaWVuY2VfUkVGVVNFRCIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX1ZvbWl0aW5nIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0IiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhCbHVycmVkX3Zpc2lvbikiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKENsYW1teV9za2luKSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oQ29uY2VudHJhdGlvbl9sb3NzKSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oQ29uZnVzaW9uKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oQ29udnVsc2lvbnMpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhEaXp6aW5lc3MpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGYWludGluZ19bYnJpZWZfbG9zc19vZl9jb25zY2lvdXNuZXNzXSkiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKEZhdGlndWUpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGZWVsaW5nX2hvdCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKEZlZWxpbmdfbGlzdGxlc3Nfb3JfbGFja19vZl9lbmdhZ2VtZW50X3dpdGhfc29jaWFsX2FjdGl2aXRpZXNfb3JfZmFtaWx5KSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmVlbGluZ19zd2VhdHkpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGZWVsaW5nX3RoaXJzdHkpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhIZWFkYWNoZSkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKElycmF0aW9uYWxfYmVoYXZpb3VyKSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oTG9zc19vZl9jb25zY2lvdXNuZXNzX1tleHRlbnNpdmVdKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oTXVzY2xlX2NyYW1wcykiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKE11c2NsZV93ZWFrbmVzcykiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKE5hdXNlYSkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKFBvb3JfcXVhbGl0eV9vZl9zbGVlcCkiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKFJhc2gpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhWb21pdGluZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRmVlbGluZ01vcmUiLCAiUGh5c2ljYWxDb25mbGljdCIsICJIZWF0QWZmZWN0IikNCg0KY2FtZXJvb25fdGlkeSA8LSBjYW1lcm9vbl9yZWFkICU+JSBtdXRhdGVfYXQoY2FtZXJvb25fZmFjdG9ycywgZmFjdG9yKSAlPiUgcmVuYW1lKFJlZ2lvbiA9IExpdHRvcmFsKQ0KDQppbmRvbmVzaWFfZmFjdG9ycyA8LSBjKCJDb3VudHJ5IiwgIkFncmVlIiwgIkFETS0xIiwgIkdlbmRlciIsICJPY2N1cGF0aW9uIiwgIk9jY3VwYXRpb25fVHJhbnNsYXRlZCIsICJPY2N1cGF0aW9uX0NvZGVkIiwgIk93bkhvdXNlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJDb29sSG9tZSIsICJFbGVjdHJpY2l0eSIsICAiRHJpbmtpbmdXYXRlciIsICJIb3VzZWhvbGRQdXJwb3NlcyIsICJSb29maW5nTWF0ZXJpYWwiLCAiV2FsbE1hdGVyaWFsIiwgIkZsb29yTWF0ZXJpYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIldpbmRvd3MiLCAiTm9ybWFsbHlEbyIsICJOb3JtYWxseURvX1RyYW5zbGF0ZWQiLCAiTm9ybWFsbHlEb19Db2RlZCIsICJBZGRfdmVudGlsYXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkNhbnRfZ29fb3V0c2lkZV8oQ09WSURfcmVsYXRlZCkiLCAiQ2xlYW5fZmxvb3Jfd2l0aF93YXRlciIsICJEb19ub3RoaW5nX3NwZWNpZmljIiwgIkRyYXdfY3VydGFpbnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkRyaW5rX2NvbGRfZHJpbmsiLCAiRHJpbmtfd2FybV9kcmluayIsICJEcmlua193YXRlciIsICJHb19vdXRzaWRlIiwgIlNpdF91bmRlcl90cmVlIiwgIlNsZWVwX291dHNpZGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIlNsZWVwX29yX2xpZV9vbl9mbG9vciIsICJTbGVlcF9vcl9yZXN0IiwgIlNtb2tlIiwgIlN0YXlfYXRfaG9tZSIsICJUYWtlX2FfYmF0aF9vcl9zaG93ZXIiLCAiVHVybl9vZmZfbGlnaHRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJUdXJuX29uX3Bvd2VyX3NvdXJjZSIsICJVbmNsZWFyIiwgIlVuZHJlc3Nfb3JfY2hhbmdlX2Nsb3RoZXNfb3Jfd2V0X2Nsb3RoZXMiLCAiVXNlX2FfY29vbGVyIiwgIlVzZV9BQyIsICJVc2VfZmFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJVc2VfbWFudWFsX2Zhbl9vcl9jb29saW5nX2RldmljZSIsICJVc2VfdGFsY3VtX3Bvd2RlciIsICJQYW5kZW1pY0NoYW5nZSIsICJZZXNQYW5kZW1pY0NoYW5nZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiWWVzUGFuZGVtaWNDaGFuZ2VfVHJhbnNsYXRlZCIsICJZZXNQYW5kZW1pY0NoYW5nZV9Db2RlZEdlbmVyYWwiLCAiWWVzUGFuZGVtaWNDaGFuZ2VfQ29kZWRTcGVjaWZpYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiU3BlbmRBdEhvbWUiLCAiQW1vdW50T2ZUaW1lIiwgIkluY29tZSIsICJFYXRpbmdIYWJpdHMiLCAiV2F0ZXJJbnRha2UiLCAiRWxlY3RyaWNpdHlVc2FnZSIsICJIZWFsdGhTZXJ2aWNlcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiSG9tZVdhcm0iLCAiVGVtcGVyYXR1cmVJbnNpZGVIb21lIiwgIlRlbXBlcmF0dXJlT3V0c2lkZUhvbWUiLCAiRXhwZXJpZW5jZV9CbHVycmVkX3Zpc2lvbiIsICJFeHBlcmllbmNlX0NsYW1teV9za2luIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0NvbmNlbnRyYXRpb25fbG9zcyIsICJFeHBlcmllbmNlX0NvbmZ1c2lvbiIsICJFeHBlcmllbmNlX0NvbnZ1bHNpb25zIiwgIkV4cGVyaWVuY2VfRGl6emluZXNzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0RPTlRfS05PVyIsICJFeHBlcmllbmNlX0ZhaW50aW5nX1ticmllZl9sb3NzX29mX2NvbnNjaW91c25lc3NdIiwgIkV4cGVyaWVuY2VfRmF0aWd1ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9GZWVsaW5nX2hvdCIsICJFeHBlcmllbmNlX0ZlZWxpbmdfbGlzdGxlc3Nfb3JfbGFja19vZl9lbmdhZ2VtZW50X3dpdGhfc29jaWFsX2FjdGl2aXRpZXNfb3JfZmFtaWx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0ZlZWxpbmdfc3dlYXR5IiwgIkV4cGVyaWVuY2VfRmVlbGluZ190aGlyc3R5IiwgIkV4cGVyaWVuY2VfSGVhZGFjaGUiLCAiRXhwZXJpZW5jZV9JcnJhdGlvbmFsX2JlaGF2aW91ciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9Mb3NzX29mX2NvbnNjaW91c25lc3NfW2V4dGVuc2l2ZV0iLCAiRXhwZXJpZW5jZV9NdXNjbGVfY3JhbXBzIiwgIkV4cGVyaWVuY2VfTXVzY2xlX3dlYWtuZXNzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX05hdXNlYSIsICJFeHBlcmllbmNlX1Bvb3JfcXVhbGl0eV9vZl9zbGVlcCIsICJFeHBlcmllbmNlX1Jhc2giLCAiRXhwZXJpZW5jZV9SRUZVU0VEIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX1ZvbWl0aW5nIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0IiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhCbHVycmVkX3Zpc2lvbikiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhDbGFtbXlfc2tpbikiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKENvbmNlbnRyYXRpb25fbG9zcykiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKENvbmZ1c2lvbikiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhDb252dWxzaW9ucykiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKERpenppbmVzcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGYWludGluZ19bYnJpZWZfbG9zc19vZl9jb25zY2lvdXNuZXNzXSkiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKEZhdGlndWUpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmVlbGluZ19ob3QpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmVlbGluZ19saXN0bGVzc19vcl9sYWNrX29mX2VuZ2FnZW1lbnRfd2l0aF9zb2NpYWxfYWN0aXZpdGllc19vcl9mYW1pbHkpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmVlbGluZ19zd2VhdHkpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGZWVsaW5nX3RoaXJzdHkpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oSGVhZGFjaGUpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhJcnJhdGlvbmFsX2JlaGF2aW91cikiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhMb3NzX29mX2NvbnNjaW91c25lc3NfW2V4dGVuc2l2ZV0pIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhNdXNjbGVfY3JhbXBzKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKE11c2NsZV93ZWFrbmVzcykiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKE5hdXNlYSkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhQb29yX3F1YWxpdHlfb2Zfc2xlZXApIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhSYXNoKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKFZvbWl0aW5nKSIsICJGZWVsaW5nTW9yZSIsICJQaHlzaWNhbENvbmZsaWN0IiwgIkhlYXRBZmZlY3QiKQ0KDQppbmRvbmVzaWFfdGlkeSA8LSBpbmRvbmVzaWFfcmVhZCAlPiUgIG11dGF0ZV9hdChpbmRvbmVzaWFfZmFjdG9ycywgZmFjdG9yKSAlPiUgDQogIHNlbGVjdCgxOjExNCkgJT4lDQogIHJlbmFtZSgiWWVzUGFuZGVtaWNDaGFuZ2VfUmVjb2RlZCIgPSAiWWVzUGFuZGVtaWNDaGFuZ2VfQ29kZWRTcGVjaWZpYyIpICU+JQ0KICBzZWxlY3QoLVllc1BhbmRlbWljQ2hhbmdlX0NvZGVkR2VuZXJhbCkgJT4lDQogIG11dGF0ZSgiTGFuZ3VhZ2UiID0gTkEsIC5iZWZvcmUgPSAiQWdyZWUiKSAlPiUNCiAgcmVuYW1lKCJSZWdpb24iID0gIkFETS0xIikNCg0KcGFraXN0YW5fZmFjdG9ycyA8LSBjKCJDb3VudHJ5IiwgIkFncmVlIiwgIlJlZ2lvbiIsICJHZW5kZXIiLCAiT2NjdXBhdGlvbiIsICJPY2N1cGF0aW9uX1RyYW5zbGF0ZWQiLCAiT2NjdXBhdGlvbl9Db2RlZCIsICJPd25Ib3VzZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJDb29sSG9tZSIsICJFbGVjdHJpY2l0eSIsICAiRHJpbmtpbmdXYXRlciIsICJIb3VzZWhvbGRQdXJwb3NlcyIsICJSb29maW5nTWF0ZXJpYWwiLCAiV2FsbE1hdGVyaWFsIiwgIkZsb29yTWF0ZXJpYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAiV2luZG93cyIsICJOb3JtYWxseURvIiwgIk5vcm1hbGx5RG9fVHJhbnNsYXRlZCIsICJOb3JtYWxseURvX0NvZGVkIiwgIkFkZF92ZW50aWxhdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICJDYW50X2dvX291dHNpZGVfKENPVklEX3JlbGF0ZWQpIiwgIkNsZWFuX2Zsb29yX3dpdGhfd2F0ZXIiLCAiRG9fbm90aGluZ19zcGVjaWZpYyIsICJEcmF3X2N1cnRhaW5zIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkRyaW5rX2NvbGRfZHJpbmsiLCAiRHJpbmtfd2FybV9kcmluayIsICJEcmlua193YXRlciIsICJHb19vdXRzaWRlIiwgIlNpdF91bmRlcl90cmVlIiwgIlNsZWVwX291dHNpZGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAiU2xlZXBfb3JfbGllX29uX2Zsb29yIiwgIlNsZWVwX29yX3Jlc3QiLCAiU21va2UiLCAiU3RheV9hdF9ob21lIiwgIlRha2VfYV9iYXRoX29yX3Nob3dlciIsICJUdXJuX29mZl9saWdodHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAiVHVybl9vbl9wb3dlcl9zb3VyY2UiLCAiVW5jbGVhciIsICJVbmRyZXNzX29yX2NoYW5nZV9jbG90aGVzX29yX3dldF9jbG90aGVzIiwgIlVzZV9hX2Nvb2xlciIsICJVc2VfQUMiLCAiVXNlX2ZhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICJVc2VfbWFudWFsX2Zhbl9vcl9jb29saW5nX2RldmljZSIsICJVc2VfdGFsY3VtX3Bvd2RlciIsICJQYW5kZW1pY0NoYW5nZSIsICJZZXNQYW5kZW1pY0NoYW5nZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJZZXNQYW5kZW1pY0NoYW5nZV9UcmFuc2xhdGVkIiwgIlllc1BhbmRlbWljQ2hhbmdlX1JlY29kZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAiU3BlbmRBdEhvbWUiLCAiQW1vdW50T2ZUaW1lIiwgIkluY29tZSIsICJFYXRpbmdIYWJpdHMiLCAiV2F0ZXJJbnRha2UiLCAiRWxlY3RyaWNpdHlVc2FnZSIsICJIZWFsdGhTZXJ2aWNlcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJIb21lV2FybSIsICJUZW1wZXJhdHVyZUluc2lkZUhvbWUiLCAiVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSIsICJFeHBlcmllbmNlX0JsdXJyZWRfdmlzaW9uIiwgIkV4cGVyaWVuY2VfQ2xhbW15X3NraW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9Db25jZW50cmF0aW9uX2xvc3MiLCAiRXhwZXJpZW5jZV9Db25mdXNpb24iLCAiRXhwZXJpZW5jZV9Db252dWxzaW9ucyIsICJFeHBlcmllbmNlX0RpenppbmVzcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0RPTlRfS05PVyIsICJFeHBlcmllbmNlX0ZhaW50aW5nX1ticmllZl9sb3NzX29mX2NvbnNjaW91c25lc3NdIiwgIkV4cGVyaWVuY2VfRmF0aWd1ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0ZlZWxpbmdfaG90IiwgIkV4cGVyaWVuY2VfRmVlbGluZ19saXN0bGVzc19vcl9sYWNrX29mX2VuZ2FnZW1lbnRfd2l0aF9zb2NpYWxfYWN0aXZpdGllc19vcl9mYW1pbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9GZWVsaW5nX3N3ZWF0eSIsICJFeHBlcmllbmNlX0ZlZWxpbmdfdGhpcnN0eSIsICJFeHBlcmllbmNlX0hlYWRhY2hlIiwgIkV4cGVyaWVuY2VfSXJyYXRpb25hbF9iZWhhdmlvdXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9Mb3NzX29mX2NvbnNjaW91c25lc3NfW2V4dGVuc2l2ZV0iLCAiRXhwZXJpZW5jZV9NdXNjbGVfY3JhbXBzIiwgIkV4cGVyaWVuY2VfTXVzY2xlX3dlYWtuZXNzIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VfTmF1c2VhIiwgIkV4cGVyaWVuY2VfUG9vcl9xdWFsaXR5X29mX3NsZWVwIiwgIkV4cGVyaWVuY2VfUmFzaCIsICJFeHBlcmllbmNlX1JFRlVTRUQiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9Wb21pdGluZyIsICJFeHBlcmllbmNlQmVmb3JlSGVhdCIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oQmx1cnJlZF92aXNpb24pIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhDbGFtbXlfc2tpbikiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKENvbmNlbnRyYXRpb25fbG9zcykiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKENvbmZ1c2lvbikiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKENvbnZ1bHNpb25zKSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRGl6emluZXNzKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmFpbnRpbmdfW2JyaWVmX2xvc3Nfb2ZfY29uc2Npb3VzbmVzc10pIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGYXRpZ3VlKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmVlbGluZ19ob3QpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGZWVsaW5nX2xpc3RsZXNzX29yX2xhY2tfb2ZfZW5nYWdlbWVudF93aXRoX3NvY2lhbF9hY3Rpdml0aWVzX29yX2ZhbWlseSkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKEZlZWxpbmdfc3dlYXR5KSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmVlbGluZ190aGlyc3R5KSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oSGVhZGFjaGUpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhJcnJhdGlvbmFsX2JlaGF2aW91cikiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKExvc3Nfb2ZfY29uc2Npb3VzbmVzc19bZXh0ZW5zaXZlXSkiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKE11c2NsZV9jcmFtcHMpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhNdXNjbGVfd2Vha25lc3MpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhOYXVzZWEpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhQb29yX3F1YWxpdHlfb2Zfc2xlZXApIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhSYXNoKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oVm9taXRpbmcpIiwgIkZlZWxpbmdNb3JlIiwgIlBoeXNpY2FsQ29uZmxpY3QiLCAiSGVhdEFmZmVjdCIpDQoNCnBha2lzdGFuX3RpZHkgPC0gcGFraXN0YW5fY3JvcHBlZCAlPiUNCiAgcmVuYW1lKCJSZWdpb24iID0gIkFETS0xIikgJT4lDQogIG11dGF0ZShSZWdpb24gPSBTaW5kaCkgJT4lDQogIHNlbGVjdCgtU2luZGgsIC1ZZXNQYW5kZW1pY0NoYW5nZV9Db2RlZEdlbmVyYWwsIC1MYW5ndWFnZTIpICU+JQ0KICBtdXRhdGUoIk9jY3VwYXRpb25fVHJhbnNsYXRlZCIgPSBOQSwgLmJlZm9yZSA9ICJPY2N1cGF0aW9uX0NvZGVkIikgJT4lDQogIHJlbmFtZSgiWWVzUGFuZGVtaWNDaGFuZ2VfUmVjb2RlZCIgPSAiWWVzUGFuZGVtaWNDaGFuZ2VfQ29kZWRTcGVjaWZpYyIpICU+JQ0KICByZW5hbWUoIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhDb25jZW50cmF0aW9uX2xvc3MpIiA9ICJFeHBlcmluZWNlQmVmb3JlSGVhdF8oQ29uY2VudHJhdGlvbl9sb3NzKSIpICU+JQ0KICBtdXRhdGVfYXQocGFraXN0YW5fZmFjdG9ycywgZmFjdG9yKQ0KDQppbmRpYV9mYWN0b3JzIDwtIGMoIkNvdW50cnkiLCAiQWdyZWUiLCAiUmVnaW9uIiwgIkdlbmRlciIsICJPY2N1cGF0aW9uIiwgIk9jY3VwYXRpb25fVHJhbnNsYXRlZCIsICJPY2N1cGF0aW9uX0NvZGVkIiwgIk93bkhvdXNlIiwgDQogICAgICAgICAgICAgICAgICAgIkNvb2xIb21lIiwgIkVsZWN0cmljaXR5IiwgICJEcmlua2luZ1dhdGVyIiwgIkhvdXNlaG9sZFB1cnBvc2VzIiwgIlJvb2ZpbmdNYXRlcmlhbCIsICJXYWxsTWF0ZXJpYWwiLCAiRmxvb3JNYXRlcmlhbCIsIA0KICAgICAgICAgICAgICAgICAgICJXaW5kb3dzIiwgIk5vcm1hbGx5RG8iLCAiTm9ybWFsbHlEb19UcmFuc2xhdGVkIiwgIk5vcm1hbGx5RG9fQ29kZWQiLCAiQWRkX3ZlbnRpbGF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgIkNhbnRfZ29fb3V0c2lkZV8oQ09WSURfcmVsYXRlZCkiLCAiQ2xlYW5fZmxvb3Jfd2l0aF93YXRlciIsICJEb19ub3RoaW5nX3NwZWNpZmljIiwgIkRyYXdfY3VydGFpbnMiLCANCiAgICAgICAgICAgICAgICAgICAiRHJpbmtfY29sZF9kcmluayIsICJEcmlua193YXJtX2RyaW5rIiwgIkRyaW5rX3dhdGVyIiwgIkdvX291dHNpZGUiLCAiU2l0X3VuZGVyX3RyZWUiLCAiU2xlZXBfb3V0c2lkZSIsIA0KICAgICAgICAgICAgICAgICAgICJTbGVlcF9vcl9saWVfb25fZmxvb3IiLCAiU2xlZXBfb3JfcmVzdCIsICJTbW9rZSIsICJTdGF5X2F0X2hvbWUiLCAiVGFrZV9hX2JhdGhfb3Jfc2hvd2VyIiwgIlR1cm5fb2ZmX2xpZ2h0cyIsIA0KICAgICAgICAgICAgICAgICAgICJUdXJuX29uX3Bvd2VyX3NvdXJjZSIsICJVbmNsZWFyIiwgIlVuZHJlc3Nfb3JfY2hhbmdlX2Nsb3RoZXNfb3Jfd2V0X2Nsb3RoZXMiLCAiVXNlX2FfY29vbGVyIiwgIlVzZV9BQyIsICJVc2VfZmFuIiwgDQogICAgICAgICAgICAgICAgICAgIlVzZV9tYW51YWxfZmFuX29yX2Nvb2xpbmdfZGV2aWNlIiwgIlVzZV90YWxjdW1fcG93ZGVyIiwgIlBhbmRlbWljQ2hhbmdlIiwgIlllc1BhbmRlbWljQ2hhbmdlIiwgDQogICAgICAgICAgICAgICAgICAgIlllc1BhbmRlbWljQ2hhbmdlX1RyYW5zbGF0ZWQiLCAiWWVzUGFuZGVtaWNDaGFuZ2VfUmVjb2RlZCIsIA0KICAgICAgICAgICAgICAgICAgICJTcGVuZEF0SG9tZSIsICJBbW91bnRPZlRpbWUiLCAiSW5jb21lIiwgIkVhdGluZ0hhYml0cyIsICJXYXRlckludGFrZSIsICJFbGVjdHJpY2l0eVVzYWdlIiwgIkhlYWx0aFNlcnZpY2VzIiwgDQogICAgICAgICAgICAgICAgICAgIkhvbWVXYXJtIiwgIlRlbXBlcmF0dXJlSW5zaWRlSG9tZSIsICJUZW1wZXJhdHVyZU91dHNpZGVIb21lIiwgIkV4cGVyaWVuY2VfQmx1cnJlZF92aXNpb24iLCAiRXhwZXJpZW5jZV9DbGFtbXlfc2tpbiIsIA0KICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0NvbmNlbnRyYXRpb25fbG9zcyIsICJFeHBlcmllbmNlX0NvbmZ1c2lvbiIsICJFeHBlcmllbmNlX0NvbnZ1bHNpb25zIiwgIkV4cGVyaWVuY2VfRGl6emluZXNzIiwgDQogICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VfRE9OVF9LTk9XIiwgIkV4cGVyaWVuY2VfRmFpbnRpbmdfW2JyaWVmX2xvc3Nfb2ZfY29uc2Npb3VzbmVzc10iLCAiRXhwZXJpZW5jZV9GYXRpZ3VlIiwgDQogICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VfRmVlbGluZ19ob3QiLCAiRXhwZXJpZW5jZV9GZWVsaW5nX2xpc3RsZXNzX29yX2xhY2tfb2ZfZW5nYWdlbWVudF93aXRoX3NvY2lhbF9hY3Rpdml0aWVzX29yX2ZhbWlseSIsIA0KICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0ZlZWxpbmdfc3dlYXR5IiwgIkV4cGVyaWVuY2VfRmVlbGluZ190aGlyc3R5IiwgIkV4cGVyaWVuY2VfSGVhZGFjaGUiLCAiRXhwZXJpZW5jZV9JcnJhdGlvbmFsX2JlaGF2aW91ciIsIA0KICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX0xvc3Nfb2ZfY29uc2Npb3VzbmVzc19bZXh0ZW5zaXZlXSIsICJFeHBlcmllbmNlX011c2NsZV9jcmFtcHMiLCAiRXhwZXJpZW5jZV9NdXNjbGVfd2Vha25lc3MiLCANCiAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZV9OYXVzZWEiLCAiRXhwZXJpZW5jZV9Qb29yX3F1YWxpdHlfb2Zfc2xlZXAiLCAiRXhwZXJpZW5jZV9SYXNoIiwgIkV4cGVyaWVuY2VfUkVGVVNFRCIsIA0KICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlX1ZvbWl0aW5nIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0IiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhCbHVycmVkX3Zpc2lvbikiLCANCiAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKENsYW1teV9za2luKSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oQ29uY2VudHJhdGlvbl9sb3NzKSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oQ29uZnVzaW9uKSIsIA0KICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oQ29udnVsc2lvbnMpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhEaXp6aW5lc3MpIiwgDQogICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGYWludGluZ19bYnJpZWZfbG9zc19vZl9jb25zY2lvdXNuZXNzXSkiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKEZhdGlndWUpIiwgDQogICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGZWVsaW5nX2hvdCkiLCANCiAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKEZlZWxpbmdfbGlzdGxlc3Nfb3JfbGFja19vZl9lbmdhZ2VtZW50X3dpdGhfc29jaWFsX2FjdGl2aXRpZXNfb3JfZmFtaWx5KSIsIA0KICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oRmVlbGluZ19zd2VhdHkpIiwgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhGZWVsaW5nX3RoaXJzdHkpIiwgDQogICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhIZWFkYWNoZSkiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKElycmF0aW9uYWxfYmVoYXZpb3VyKSIsIA0KICAgICAgICAgICAgICAgICAgICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oTG9zc19vZl9jb25zY2lvdXNuZXNzX1tleHRlbnNpdmVdKSIsICJFeHBlcmllbmNlQmVmb3JlSGVhdF8oTXVzY2xlX2NyYW1wcykiLCANCiAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKE11c2NsZV93ZWFrbmVzcykiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKE5hdXNlYSkiLCANCiAgICAgICAgICAgICAgICAgICAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKFBvb3JfcXVhbGl0eV9vZl9zbGVlcCkiLCAiRXhwZXJpZW5jZUJlZm9yZUhlYXRfKFJhc2gpIiwgDQogICAgICAgICAgICAgICAgICAgIkV4cGVyaWVuY2VCZWZvcmVIZWF0XyhWb21pdGluZykiLCAiRmVlbGluZ01vcmUiLCAiUGh5c2ljYWxDb25mbGljdCIsICJIZWF0QWZmZWN0IikNCg0KaW5kaWFfdGlkeSA8LSBpbmRpYV9jcm9wcGVkICU+JQ0KICBzZWxlY3QoLWBBRE0tMS1JTkQxYCwgLWBBRE0tMS1JTkQyYCwgLWBBRE0tMS1JTkQzYCwgLWBBRE0tMS1JTkQ0YCkgJT4lDQogIHJlbmFtZSgiUmVnaW9uIiA9ICJBRE0tMS1JTkQ1IikgJT4lDQogIG11dGF0ZSgiT2NjdXBhdGlvbl9UcmFuc2xhdGVkIiA9IE5BLCAuYmVmb3JlID0gIk9jY3VwYXRpb25fQ29kZWQiKSAlPiUNCiAgcmVuYW1lKCJZZXNQYW5kZW1pY0NoYW5nZV9SZWNvZGVkIiA9ICJZZXNQYW5kZW1pY0NoYW5nZV9Db2RlZFNwZWNpZmljIikgJT4lDQogIHNlbGVjdCgtWWVzUGFuZGVtaWNDaGFuZ2VfQ29kZWRHZW5lcmFsLCAtTGFuZ3VhZ2UyKSAlPiUNCiAgcmVuYW1lKCJUZW1wZXJhdHVyZSIgPSAiVGVtcGVyYXR1cmVfKEMpIiwgIkhlYXRfSW5kZXgiID0gIkhlYXRfSW5kZXhfKEMpIikgJT4lDQogIG11dGF0ZV9hdChpbmRpYV9mYWN0b3JzLCBmYWN0b3IpDQoNCg0KDQoNCiMgSm9pbiBkYXRhIHRvIG1ha2UgYSBuZXcgZGF0YXNldCBpbmNsdWRpbmcgQUxMIGZvdXIgY291bnRyaWVzIC0gZHJvcCBvbmUgcm93IGZyb20gSW5kb25lc2lhIChsYWNrcyBDb3VudHJ5IHZhcmlhYmxlKQ0KIyBTdWJzZXRzIHRvIG9ubHkgdGhvc2UgaG91c2Vob2xkcyB3aXRoIG1heGltdW0gMjQgaG91cnMgcGVyIGRheSBvZiBlbGVjdHJpY2l0eQ0KIyBBbHNvIHRpZHkgc29tZSB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBuZXcgdmFyaWFibGVzDQpuZXh1c2RhdGEgPC0gYmluZF9yb3dzKGNhbWVyb29uX3RpZHksIGluZG9uZXNpYV90aWR5LCBwYWtpc3Rhbl90aWR5LCBpbmRpYV90aWR5KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShDb3VudHJ5KSkgJT4lDQogIG11dGF0ZShMYW5ndWFnZSA9IGFzX2ZhY3RvcihMYW5ndWFnZSkpICU+JQ0KICBtdXRhdGUoT3B0SW5fRGF0ZSA9IGRteShPcHRJbl9EYXRlKSkgJT4lDQogIG11dGF0ZShSZWdpb24gPSByZWNvZGUoUmVnaW9uLCBET1VBTEEgPSAiRG91YWxhIiwgJ0pha2FydGEgU3BlY2lhbCBDYXBpdGFsIFJlZ2lvbicgPSAiSmFrYXJ0YSIpKSAlPiUNCiAgbXV0YXRlKENpdHkgPSBhc19mYWN0b3Ioc3RyX2MoQ291bnRyeSwgIiAtICIsIFJlZ2lvbikpKSAlPiUNCiAgbXV0YXRlKENvdW50cnkgPSBmY3RfcmVsZXZlbChDb3VudHJ5LCBjKCJQYWtpc3RhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZG9uZXNpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJvb24iKSkpICU+JQ0KICBtdXRhdGUoR2VuZGVyID0gYXNfZmFjdG9yKHN0cl90b19zZW50ZW5jZShHZW5kZXIpKSkgJT4lDQogIG11dGF0ZShEcmlua2luZ1dhdGVyID0gYXNfZmFjdG9yKHJlY29kZShEcmlua2luZ1dhdGVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT1RUTEVTIiA9ICJib3R0bGVkIHdhdGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDT01NVU5BTCBUQVAvU0hBUkVEIFRBUCBbQUxTTyBDQUxMRUQgU1RBTkQgUElQRS9TVFJFRVQgRU5EIFRBUC9ZQVJEIFRBUF0nID0gInNoYXJlZCB0YXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NVUFBMSUVEIElOIFRBTktTJyA9ICJzdXBwbGllZCBpbiB0YW5rcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1RIRVIiID0gIm90aGVyIikpKSAlPiUNCiAgbXV0YXRlKEhvdXNlaG9sZFB1cnBvc2VzID0gcmVjb2RlKEhvdXNlaG9sZFB1cnBvc2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NPTU1VTkFMIE9SIFNUUkVFVC1FTkQgVEFQJyA9ICJzaGFyZWQgdGFwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPVEhFUiIgPSAib3RoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NVUFBMSUVEIElOIFRBTktTJyA9ICJzdXBwbGllZCBpbiB0YW5rcyIpKSAlPiUNCiAgZmlsdGVyKEhvdXJzRGF5PDI1KSAlPiUgIyBSZW1vdmUgdW5yZWFsaXN0aWMgaG91cnMgb2YgZWxlY3RyaWNpdHkgcGVyIGRheQ0KICBmaWx0ZXIoUGVvcGxlX2luX0hvdXNlPDE2KSAlPiUgIyBSZW1vdmUgb3V0bGllcnMgKDk5LjklIG9mIHRoZSBkYXRhKQ0KICBtdXRhdGUoU3BlbmRBdEhvbWUgPSBhc19mYWN0b3Ioc3RyX3RvX3NlbnRlbmNlKFNwZW5kQXRIb21lKSkpICU+JQ0KICBtdXRhdGUoU3BlbmRBdEhvbWUgPSBmY3RfcmVsZXZlbChTcGVuZEF0SG9tZSwgYygiTW9zdCBvZiB0aGUgZGF5IC0gZXhjZXB0IGZvciBzaG9ydCB0cmlwcyBvdXQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIYWxmIG9mIHRoZSBkYXkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIG9mIHRoZSBkYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnkgbGl0dGxlIC0gb25seSBmb3Igc2xlZXBpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3ciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIikpKSAlPiUNCiAgbXV0YXRlKEFtb3VudE9mVGltZSA9IGFzX2ZhY3RvcihzdHJfdG9fc2VudGVuY2UoQW1vdW50T2ZUaW1lKSkpICU+JQ0KICBtdXRhdGUoQW1vdW50T2ZUaW1lID0gZmN0X3JlbGV2ZWwoQW1vdW50T2ZUaW1lLCBjKCJTaWduaWZpY2FudGx5IGluY3JlYXNlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xpZ2h0bHkgaW5jcmVhc2VkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW1haW5lZCBhYm91dCB0aGUgc2FtZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGlnaHRseSBkZWNyZWFzZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpZ25pZmljYW50bHkgZGVjcmVhc2VkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIikpKSAlPiUNCiAgbXV0YXRlKEluY29tZSA9IGFzX2ZhY3RvcihzdHJfdG9fc2VudGVuY2UoSW5jb21lKSkpICU+JQ0KICBtdXRhdGUoSW5jb21lID0gZmN0X3JlbGV2ZWwoSW5jb21lLCBjKCJTaWduaWZpY2FudGx5IGluY3JlYXNlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGlnaHRseSBpbmNyZWFzZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtYWluZWQgYWJvdXQgdGhlIHNhbWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGlnaHRseSBkZWNyZWFzZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2lnbmlmaWNhbnRseSBkZWNyZWFzZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIikpKSAlPiUNCiAgbXV0YXRlKE9jY3VwYXRpb25fQ29kZWQgPSBhc19mYWN0b3Ioc3RyX3RvX3NlbnRlbmNlKE9jY3VwYXRpb25fQ29kZWQpKSkgJT4lDQogIG11dGF0ZShFYXRpbmdIYWJpdHMgPSBmY3RfcmVsZXZlbChFYXRpbmdIYWJpdHMsIGMoIkkgRUFUIE1PUkUgLSBJVCBJUyBFTk9VR0giLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTk8gQ0hBTkdFIC0gSVQgSVMgRU5PVUdIIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5PIENIQU5HRSAtIElUIElTIE5PVCBFTk9VR0giLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSBFQVQgTEVTUyAtIElUIElTIEVOT1VHSCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgRUFUIExFU1MgLSBJVCBJUyBOT1QgRU5PVUdIIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRPTidUIEtOT1ciKSkpICU+JQ0KICBtdXRhdGUoV2F0ZXJJbnRha2UgPSBhc19mYWN0b3Ioc3RyX3RvX3NlbnRlbmNlKFdhdGVySW50YWtlKSkpICU+JQ0KICBtdXRhdGUoV2F0ZXJJbnRha2UgPSBhc19mYWN0b3IocmVjb2RlKFdhdGVySW50YWtlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWWVzIC0gaSB1c2UgbW9yZSIgPSAiWWVzIC0gSSB1c2UgbW9yZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlllcyAtIGkgdXNlIGxlc3MiID0gIlllcyAtIEkgdXNlIGxlc3MiKSkpICU+JQ0KICBtdXRhdGUoV2F0ZXJJbnRha2UgPSBmY3RfcmVsZXZlbChXYXRlckludGFrZSwgYygiWWVzIC0gSSB1c2UgbW9yZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyAtIG5vIGNoYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZXMgLSBJIHVzZSBsZXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3ciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmdXNlZCIpKSkgJT4lDQogIG11dGF0ZShFbGVjdHJpY2l0eVVzYWdlID0gZmN0X3JlbGV2ZWwoRWxlY3RyaWNpdHlVc2FnZSwgYygiSSBIQVZFIEJFRU4gQUJMRSBUTyBVU0UgTU9SRSBFTkVSR1kiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTk8gQ0hBTkdFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgSEFWRSBIQUQgVE8gVVNFIExFU1MgRU5FUkdZIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRPTidUIEtOT1ciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVGVVNFRCIpKSkgJT4lDQogIG11dGF0ZShFbGVjdHJpY2l0eVVzYWdlID0gYXNfZmFjdG9yKHN0cl90b19zZW50ZW5jZShFbGVjdHJpY2l0eVVzYWdlKSkpICU+JQ0KICBtdXRhdGUoRWxlY3RyaWNpdHkgPSBzdHJfdG9fc2VudGVuY2UoRWxlY3RyaWNpdHkpKSAlPiUNCiAgbXV0YXRlKEVsZWN0cmljaXR5ID0gZmN0X3JlbGV2ZWwoRWxlY3RyaWNpdHksIGMoIlNvbGFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0b3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTItdm9sdCBiYXR0ZXJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm9ybWFsIGNvbm5lY3Rpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKSkpICU+JQ0KICBtdXRhdGUoSGVhbHRoU2VydmljZXMgPSBhc19mYWN0b3Ioc3RyX3RvX3NlbnRlbmNlKEhlYWx0aFNlcnZpY2VzKSkpICU+JQ0KICBtdXRhdGUoSGVhbHRoU2VydmljZXMgPSBmY3RfcmVsZXZlbChIZWFsdGhTZXJ2aWNlcywgYygiSGFyZGVyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzYW1lIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVhc2llciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyIpKSkgJT4lDQogIG11dGF0ZShIb21lV2FybSA9IGFzX2ZhY3RvcihzdHJfdG9fc2VudGVuY2UoSG9tZVdhcm0pKSkgJT4lDQogIG11dGF0ZShIb21lV2FybSA9IGZjdF9yZWxldmVsKEhvbWVXYXJtLCBjKCJWZXJ5IGhvdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXV0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsaWdodGx5IGNvb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29vbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3ciKSkpICU+JQ0KICBtdXRhdGUoVGVtcGVyYXR1cmVJbnNpZGVIb21lID0gYXNfZmFjdG9yKHN0cl90b19zZW50ZW5jZShUZW1wZXJhdHVyZUluc2lkZUhvbWUpKSkgJT4lDQogIG11dGF0ZShUZW1wZXJhdHVyZUluc2lkZUhvbWUgPSBmY3RfcmVsZXZlbChUZW1wZXJhdHVyZUluc2lkZUhvbWUsIGMoIlZlcnkgaG90IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsaWdodGx5IHdhcm0iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tZm9ydGFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xpZ2h0bHkgY29vbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb29sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIikpKSAlPiUNCiAgbXV0YXRlKFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUgPSBhc19mYWN0b3Ioc3RyX3RvX3NlbnRlbmNlKFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUpKSkgJT4lDQogIG11dGF0ZShUZW1wZXJhdHVyZU91dHNpZGVIb21lID0gZmN0X3JlbGV2ZWwoVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSwgYygiSW50b2xlcmFibGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWZXJ5IGRpZmZpY3VsdCB0byB0b2xlcmF0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaXJseSBkaWZmaWN1bHQgdG8gdG9sZXJhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsaWdodGx5IGRpZmZpY3VsdCB0byB0b2xlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyZmVjdGx5IHRvbGVyYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmdXNlZCIpKSkgJT4lDQogIG11dGF0ZShFeHBlcmllbmNlX0RPTlRfS05PVyA9IGZjdF9leHBsaWNpdF9uYShFeHBlcmllbmNlX0RPTlRfS05PVywgbmFfbGV2ZWwgPSAiTm8iKSkgJT4lDQogIHNlbGVjdCghYyhBZ3JlZSwgT2NjdXBhdGlvbiwgT2NjdXBhdGlvbl9UcmFuc2xhdGVkLCBZZXNQYW5kZW1pY0NoYW5nZSwgWWVzUGFuZGVtaWNDaGFuZ2VfVHJhbnNsYXRlZCwgTm9ybWFsbHlEbywgTm9ybWFsbHlEb19UcmFuc2xhdGVkKSkNCg0KDQojIE1ha2Ugc29tZSBuZXcgdmFyaWFibGVzDQpuZXduZXh1cyA8LSBuZXh1c2RhdGEgJT4lDQogIG11dGF0ZShFbXBsb3ltZW50ID0gYXNfZmFjdG9yKHJlY29kZShPY2N1cGF0aW9uX0NvZGVkLCAjIE5vdGUgdGhhdCB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSBpbnRvIGZvdXIgY2F0ZWdvcmllcyAtIHNlZSByZXBvcnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFTVBMT1lFRCBJTiBQUklWQVRFIENPTVBBTlknID0gIldvcmtpbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dPVkVSTk1FTlQgV09SSycgPSAiV29ya2luZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUEFJRCBMQUJPUi9XQUdFJyA9ICJXb3JraW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIT1VTRVdJRkUnID0gIkhvbWVtYWtlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSE9VU0VXSUZFL0hVU0JBTkQvSE9NRU1BS0VSJyA9ICJIb21lbWFrZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FHUklDVUxUVVJFL0hVU0JBTkRSWS9GSVNISU5HJyA9ICJXb3JraW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJTkZPUk1BTCBUUkFERSAvIFNUUkVFVCBTQUxFUycgPSAiV29ya2luZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQlVTSU5FU1MvU0VMRi1FTVBMT1lFRCcgPSAiV29ya2luZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU1RVREVOVCcgPSAiU3R1ZGVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVU5FTVBMT1lFRCcgPSAiTm90IHdvcmtpbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dPVkVSTk1FTlQgQVNTSVNUQU5DRSAvIFNPQ0lBTCBQUk9URUNUSU9OIE5FVFdPUktTIFtQRU5TSU9OU10nID0gIk5vdCB3b3JraW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNSUdSQU5UIFJFTUlUVEFOQ0VTIFtGUk9NIE9VVFNJREUgT0YgVEhFIENPVU5UUlldJyA9ICJOb3Qgd29ya2luZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR09WRVJOTUVOVCBBU1NJU1RBTkNFL1NPQ0lBTCBQUk9URUNUSU9OIE5FVFdPUktTIFtQRU5TSU9OU10nID0gIk5vdCB3b3JraW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIRUxQIEZST00gRkFNSUxZIEFORC9PUiBGUklFTkRTIFtGUk9NIElOU0lERSBPRiBUSEUgQ09VTlRSWV0nID0gIk5vdCB3b3JraW5nIikpKSAlPiUNCiAgbXV0YXRlKHdhbGxtYXNzID0gcmVjb2RlKFdhbGxNYXRlcmlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQU1CT08gUE9MRVMgT1IgV09PRCIgPSAiTGlnaHR3ZWlnaHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1VRCBCUklDSyBbQ1JVREUvUkFXL0NPT0tFRF0iID0gIkhlYXZ5d2VpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQUxNIEZST05EUy9XT1ZFTiBNQVRTIiA9ICJMaWdodHdlaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVJTkZPUkNFRCBDT05DUkVURSIgPSAiSGVhdnl3ZWlnaHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRPTidUIEtOT1ciPSAiRG9uJ3Qga25vdyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVGVVNFRCIgPSAiUmVmdXNlZCIpKSAlPiUNCiAgbXV0YXRlKHJvb2ZtYXNzID0gcmVjb2RlKFJvb2ZpbmdNYXRlcmlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQU1CT08iID0gIkxpZ2h0d2VpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJHQUxWQU5JU0VEIElST04iPSAiTGlnaHR3ZWlnaHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBTE0gRlJPTkRTIj0gIkxpZ2h0d2VpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRUlORk9SQ0VEIENPTkNSRVRFIj0gIkhlYXZ5d2VpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSEVFVCBNRVRBTCBbVElOL1pJTkMvQ09SUlVHQVRFRCBJUk9OXSI9ICJMaWdodHdlaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVC1HSVJERVIiPSAiSGVhdnl3ZWlnaHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIldPT0RFTiBTSElOR0xFUyI9ICJMaWdodHdlaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0VSQU1JQyBUSUxFIj0gIkhlYXZ5d2VpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJET04nVCBLTk9XIj0gIkRvbid0IGtub3ciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRSSUVEIENMQVkiPSAiSGVhdnl3ZWlnaHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFRlVTRUQiID0gIlJlZnVzZWQiKSkgJT4lDQogIG11dGF0ZSh3YWxsdGhlcm0gPSByZWNvZGUoV2FsbE1hdGVyaWFsLCAiQkFNQk9PIFBPTEVTIE9SIFdPT0QiID0gIkxpZ2h0d2VpZ2h0IGxvdyB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1VRCBCUklDSyBbQ1JVREUvUkFXL0NPT0tFRF0iID0gIkhlYXZ5d2VpZ2h0IGxvdyB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBTE0gRlJPTkRTL1dPVkVOIE1BVFMiID0gIkxpZ2h0d2VpZ2h0IGxvdyB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFSU5GT1JDRUQgQ09OQ1JFVEUiID0gIkhlYXZ5d2VpZ2h0IGhpZ2ggdGhlcm1hbCBjb25kdWN0aXZpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJET04nVCBLTk9XIj0gIkRvbid0IGtub3ciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRUZVU0VEIiA9ICJSZWZ1c2VkIikpICU+JQ0KICBtdXRhdGUocm9vZnRoZXJtID0gcmVjb2RlKFJvb2ZpbmdNYXRlcmlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQkFNQk9PIiA9ICJMaWdodHdlaWdodCBsb3cgdGhlcm1hbCBjb25kdWN0aXZpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHQUxWQU5JU0VEIElST04iPSAiTGlnaHR3ZWlnaHQgaGlnaCB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBTE0gRlJPTkRTIj0gIkxpZ2h0d2VpZ2h0IGxvdyB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFSU5GT1JDRUQgQ09OQ1JFVEUiPSAiSGVhdnl3ZWlnaHQgaGlnaCB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNIRUVUIE1FVEFMIFtUSU4vWklOQy9DT1JSVUdBVEVEIElST05dIj0gIkxpZ2h0d2VpZ2h0IGhpZ2ggdGhlcm1hbCBjb25kdWN0aXZpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJULUdJUkRFUiI9ICJIZWF2eXdlaWdodCBoaWdoIHRoZXJtYWwgY29uZHVjdGl2aXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV09PREVOIFNISU5HTEVTIj0gIkxpZ2h0d2VpZ2h0IGxvdyB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNFUkFNSUMgVElMRSI9ICJIZWF2eXdlaWdodCBsb3cgdGhlcm1hbCBjb25kdWN0aXZpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJET04nVCBLTk9XIj0gIkRvbid0IGtub3ciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEUklFRCBDTEFZIj0gIkhlYXZ5d2VpZ2h0IGxvdyB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFRlVTRUQiID0gIlJlZnVzZWQiKSkgJT4lDQogIG11dGF0ZShUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQgPSByZWNvZGUoVGVtcGVyYXR1cmVJbnNpZGVIb21lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnkgaG90IiA9ICJIb3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3QiID0gIkhvdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0iID0gIkhvdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWdodGx5IHdhcm0iID0gIkhvdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbWZvcnRhYmxlIiA9ICJDb21mb3J0YWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xpZ2h0bHkgY29vbCIgPSAiQ29sZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAiQ29sZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAgIkNvbGQiKSkgJT4lDQogIG11dGF0ZShIb3Vyc0RheUNhdCA9IGN1dChIb3Vyc0RheSwgYnJlYWtzPXNlcSgwLDI0LDQpLCBsYWJlbHM9YygiMC00IiwiNS04IiwiOS0xMiIsICIxMy0xNiIsICIxNy0yMCIsICIyMS0yNCIpKSkgJT4lDQogIG11dGF0ZShwc2V1ZG9JRCA9IHJvd19udW1iZXIoKSkgJT4lDQogIG11dGF0ZShXYWxsTWF0ZXJpYWwgPSBzdHJfdG9fc2VudGVuY2UoV2FsbE1hdGVyaWFsKSkgJT4lDQogIG11dGF0ZShSb29maW5nTWF0ZXJpYWwgPSBzdHJfdG9fc2VudGVuY2UoUm9vZmluZ01hdGVyaWFsKSkNCg0KbmV4dXNOb3JtYWxseURvIDwtIG5ld25leHVzICU+JSBwaXZvdF9sb25nZXIoY29scyA9IEFkZF92ZW50aWxhdGlvbjpVc2VfdGFsY3VtX3Bvd2RlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIk5vcm1hbGx5RG9fTmV3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJOb3JtYWxseURvX1NlbGVjdGlvbiIpICU+JQ0KICBncm91cF9ieShOb3JtYWxseURvX05ldywgTm9ybWFsbHlEb19TZWxlY3Rpb24pICU+JQ0KICBtdXRhdGUoTm9ybWFsbHlEb19OZXcgPSBhc19mYWN0b3IoTm9ybWFsbHlEb19OZXcpKQ0KDQpuZXh1c0V4cGVyaWVuY2UgPC0gbmV3bmV4dXMgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gRXhwZXJpZW5jZV9CbHVycmVkX3Zpc2lvbjpFeHBlcmllbmNlX1ZvbWl0aW5nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiRXhwZXJpZW5jZV9OZXciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkV4cGVyaWVuY2VfU2VsZWN0aW9uIikgJT4lDQogIGdyb3VwX2J5KEV4cGVyaWVuY2VfTmV3LCBFeHBlcmllbmNlX1NlbGVjdGlvbikgJT4lDQogIG11dGF0ZShFeHBlcmllbmNlX05ldyA9IGFzX2ZhY3RvcihFeHBlcmllbmNlX05ldykpDQoNCm5leHVzRXhwZXJpZW5jZUJlZm9yZUhlYXQgPC0gbmV3bmV4dXMgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gYEV4cGVyaWVuY2VCZWZvcmVIZWF0XyhCbHVycmVkX3Zpc2lvbilgOmBFeHBlcmllbmNlQmVmb3JlSGVhdF8oVm9taXRpbmcpYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJFeHBlcmllbmNlQmVmb3JlSGVhdF9OZXciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJFeHBlcmllbmNlQmVmb3JlSGVhdF9TZWxlY3Rpb24iKSAlPiUNCiAgZ3JvdXBfYnkoRXhwZXJpZW5jZUJlZm9yZUhlYXRfTmV3LCBFeHBlcmllbmNlQmVmb3JlSGVhdF9TZWxlY3Rpb24pICU+JQ0KICBtdXRhdGUoRXhwZXJpZW5jZUJlZm9yZUhlYXRfTmV3ID0gYXNfZmFjdG9yKEV4cGVyaWVuY2VCZWZvcmVIZWF0X05ldykpDQoNCg0KDQpgYGANCg0KIyBHcmFwaHMgZnJvbSBwcmV2aW91cyBwYXBlcg0KDQojIyBQYWtpc3RhbiANCg0KYGBge3IsIGNhY2hlID0gVFJVRX0NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiMgR3JhcGhzIGZvciByZXBvcnQNCg0KY2JQYWxldHRlIDwtIGMoIiM5OTk5OTkiLCAiI0U2OUYwMCIsICIjNTZCNEU5IiwgIiMwMDlFNzMiLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiNENTVFMDAiLCAiI0NDNzlBNyIpICMgRnJvbSBodHRwOi8vd3d3LmNvb2tib29rLXIuY29tL0dyYXBocy9Db2xvcnNfKGdncGxvdDIpLyNhLWNvbG9yYmxpbmQtZnJpZW5kbHktcGFsZXR0ZQ0KbmV3bmFtZXMgPC0gbmFtZXMobmV3bmV4dXMpDQoNCg0KIyBQYWdlIDMzDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzICU+JSBmaWx0ZXIoQ291bnRyeT09IlBha2lzdGFuIikgJT4lDQogICAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IEFkZF92ZW50aWxhdGlvbjpVc2VfdGFsY3VtX3Bvd2RlciwNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJOb3JtYWxseURvX05ldyIsDQogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlNlbGVjdGlvbiIpICU+JQ0KICAgICAgICAgZ3JvdXBfYnkoTm9ybWFsbHlEb19OZXcsIFNlbGVjdGlvbikgJT4lDQogICAgICAgICBtdXRhdGUoTm9ybWFsbHlEb19OZXcgPSBhc19mYWN0b3IoTm9ybWFsbHlEb19OZXcpKSAlPiUNCiAgICAgICAgIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgICAgICAgIGZpbHRlcihTZWxlY3Rpb24gPT0gIlllcyIpICU+JQ0KICAgICAgICAgYXJyYW5nZShkZXNjKG4pKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJlb3JkZXIoTm9ybWFsbHlEb19OZXcsIG4pLCB5ID0gbiksIHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gIiM5OTk5OTkiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiVGFrZV9hX2JhdGhfb3Jfc2hvd2VyIiA9ICJUYWtlIGEgYmF0aCBvciBzaG93ZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvX291dHNpZGUiID0gIkdvIG91dHNpZGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZV9mYW4iID0gIlVzZSBmYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvX25vdGhpbmdfc3BlY2lmaWMiID0gIkRvIG5vdGhpbmcgc3BlY2lmaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRyaW5rX2NvbGRfZHJpbmsiID0gIkRyaW5rIGNvbGQgZHJpbmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZV9tYW51YWxfZmFuX29yX2Nvb2xpbmdfZGV2aWNlIiA9ICJVc2UgbWFudWFsIGZhbiBvciBjb29saW5nIGRldmljZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRkX3ZlbnRpbGF0aW9uIiA9ICJBZGQgdmVudGlsYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1cm5fb25fcG93ZXJfc291cmNlIiA9ICJUdXJuIG9uIHBvd2VyIHNvdXJjZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHJpbmtfd2F0ZXIiID0gIkRyaW5rIHdhdGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VfYV9jb29sZXIiID0gIlVzZSBhIGNvb2xlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xlYW5fZmxvb3Jfd2l0aF93YXRlciIgPSAiQ2xlYW4gZmxvb3Igd2l0aCB3YXRlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RheV9hdF9ob21lIiA9ICJTdGF5IGF0IGhvbWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsZWVwX29yX3Jlc3QiID0gIlNsZWVwIG9yIHJlc3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZV90YWxjdW1fcG93ZGVyIiA9ICJVc2UgdGFsY3VtIHBvd2RlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlX0FDIiA9ICJVc2UgQUMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZHJlc3Nfb3JfY2hhbmdlX2Nsb3RoZXNfb3Jfd2V0X2Nsb3RoZXMiID0gIlVuZHJlc3Mgb3IgY2hhbmdlIGNsb3RoZXMgb3Igd2V0IGNsb3RoZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRyaW5rX3dhcm1fZHJpbmsiID0gIkRyaW5rIHdhcm0gZHJpbmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpdF91bmRlcl90cmVlIiA9ICJTaXQgdW5kZXIgdHJlZSIpKSArDQogIHhsYWIoIlN0cmF0ZWdpZXMgbm9ybWFsbHkgdXNlZCB0byBtYW5hZ2UgaGVhdCIpICsNCiAgY29vcmRfZmxpcCgpDQoNCiMgUGFnZSAzNA0KbmV3bmV4dXMgJT4lIA0KICBmaWx0ZXIoQ291bnRyeSA9PSAiUGFraXN0YW4iKSAlPiUNCiAgZ3JvdXBfYnkoU3BlbmRBdEhvbWUsIEdlbmRlcikgJT4lDQogIGNvdW50KCkgJT4lDQogIGdyb3VwX2J5KEdlbmRlcikgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbi9zdW0obikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBTcGVuZEF0SG9tZSwgeSA9IHBlcmNlbnRhZ2UsIGZpbGwgPSBHZW5kZXIpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKw0KICB4bGFiKCJUaW1lIHNwZW50IGF0IGhvbWUgYmVmb3JlIHBhbmRlbWljIikgKw0KICB5bGFiKCJQZXJjZW50YWdlIG9mIGdyb3VwIikNCg0KIyBQYWdlIDM1DQpuZXduZXh1cyAlPiUgDQogIGZpbHRlcihDb3VudHJ5ID09ICJQYWtpc3RhbiIpICU+JQ0KICBncm91cF9ieShBbW91bnRPZlRpbWUsIEdlbmRlcikgJT4lDQogIGNvdW50KCkgJT4lDQogIGdyb3VwX2J5KEdlbmRlcikgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbi9zdW0obikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBbW91bnRPZlRpbWUsIHkgPSBwZXJjZW50YWdlLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgeGxhYigiQ2hhbmdlIGluIHRpbWUgYXQgaG9tZSBhZnRlciBwYW5kZW1pYyIpICsNCiAgeWxhYigiUGVyY2VudGFnZSBvZiBncm91cCIpDQoNCiMgUGFnZSAzNg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cyAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlBha2lzdGFuIikpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBFbGVjdHJpY2l0eSksIHBvc2l0aW9uID0gImRvZGdlIiwgZmlsbCA9ICIjOTk5OTk5IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKw0KICB5bGFiKCJuIikgKw0KICB4bGFiKCJTb3VyY2Ugb2YgZWxlY3RyaWNpdHkiKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiUGFraXN0YW4iKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEhvdXJzRGF5KSwgZmlsbCA9ICIjOTk5OTk5IikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0LDEpKSArDQogIHhsYWIoIkhvdXJzIG9mIGVsZWN0cmljaXR5IHBlciBkYXkiKSArDQogIHlsYWIoIm4iKQ0KDQojIFBhZ2UgMzcNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJQYWtpc3RhbiIpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gRWxlY3RyaWNpdHksIGZpbGwgPSBIb3Vyc0RheUNhdCksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgeGxhYigiU291cmNlIG9mIGVsZWN0cmljaXR5IikgKw0KICB5bGFiKCJuIikgKw0KICBsYWJzKGZpbGwgPSAiSG91cnMgb2YgZWxlY3RyaWNpdHkgcGVyIGRheSIpDQogIA0KIyBQYWdlIDM4DQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiUGFraXN0YW4iKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJlb3JkZXIoRWxlY3RyaWNpdHlVc2FnZSwgZGVzYyhFbGVjdHJpY2l0eVVzYWdlKSkpLCBmaWxsID0gIiM5OTk5OTkiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHhsYWIoIkNoYW5nZSBpbiB1c2Ugb2YgZWxlY3RyaWNpdHkiKSArDQogIHlsYWIoIm4iKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJQYWtpc3RhbiIpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gcmVvcmRlcihFbGVjdHJpY2l0eVVzYWdlLCBkZXNjKEVsZWN0cmljaXR5VXNhZ2UpKSwgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIHhsYWIoIkNoYW5nZSBpbiB1c2Ugb2YgZWxlY3RyaWNpdHkiKSArDQogIHlsYWIoIm4iKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ2l0eSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQojIFBhZ2UgMzkNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJQYWtpc3RhbiIpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gcmVvcmRlcihXYXRlckludGFrZSwgZGVzYyhXYXRlckludGFrZSkpKSwgZmlsbCA9ICIjOTk5OTk5IikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB4bGFiKCJDaGFuZ2UgaW4gd2F0ZXIgaW50YWtlIikgKw0KICB5bGFiKCJuIikNCiAgDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiUGFraXN0YW4iKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJlb3JkZXIoV2F0ZXJJbnRha2UsIGRlc2MoV2F0ZXJJbnRha2UpKSwgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIHhsYWIoIkNoYW5nZSBpbiB3YXRlciBpbnRha2UiKSArDQogIHlsYWIoIm4iKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ2l0eSkpIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5PT0iUGFraXN0YW4iKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IE5vcm1hbGx5RG9fQ29kZWQpKSArDQogIGNvb3JkX2ZsaXAoKSAjIGNsZWFybHkgc29tZSBwcm9ibGVtcyB3aXRoIE5vcm1hbGx5RG9fQ29kZWQgLSB0b28gbWFueSBjYXRlZ29yaWVzIC0gbmVlZCB0byBiZSByZW9yZ2FuaXNlZCBhY2NvcmRpbmcgdG8gY2F0cyBpbiByZXBvcnQgcGFnZSAzMw0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzICU+JSBmaWx0ZXIoQ291bnRyeT09IlBha2lzdGFuIikpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBTcGVuZEF0SG9tZSwgZmlsbCA9IEdlbmRlciksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICMgV29ya3Mgb2theSBidXQgbmVlZHMgdGhlIGNhdGVnb3JpZXMgdG8gYmUgcmVvcmRlcmVkDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cyAlPiUgZmlsdGVyKENvdW50cnk9PSJQYWtpc3RhbiIpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gQW1vdW50T2ZUaW1lLCBmaWxsID0gR2VuZGVyKSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgIyBXb3JrcyBva2F5IGJ1dCB3ZSBzaG91bGQgdXNlIGxlc3Mgc3RlcmVvdHlwaW5nIGNvbG91cnMgZm9yIHRoZSBnZW5kZXJzDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5PT0iUGFraXN0YW4iLCBIb3Vyc0RheSA8IDI1KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeCA9IEhvdXJzRGF5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArICNTdGlsbCBnb3Qgc29tZSA4OCB2YWx1ZSBpbiBoZXJlIHRoYXQgc2hvdWxkIGdvDQogIHNjYWxlX3hfY29udGludW91cyhuLmJyZWFrcyA9IDI0KSArDQogIHN0YXRfZWNkZihhZXMoeCA9IEhvdXJzRGF5KSwgZ2VvbSA9ICJzdGVwIiwgcGFkID0gIkZBTFNFIikNCiAgZ2VvbV9saW5lKGFlcyh5ID0gYWVzKGN1bXN1bShIb3Vyc0RheSksIHggPSBzZXEoMToyNCkpKSkgIyBUaGlzIGRvZXNuJ3Qgd29yaw0KDQpgYGANCg0KIyMgSW5kaWENCg0KYGBge3IsIGNhY2hlID0gVFJVRX0NCiMgUGFnZSA1MQ0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cyAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkluZGlhIikpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBFbGVjdHJpY2l0eSwgZmlsbCA9IEhvdXJzRGF5Q2F0KSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKw0KICB4bGFiKCJTb3VyY2Ugb2YgZWxlY3RyaWNpdHkiKSArDQogIHlsYWIoIm4iKSArDQogIGxhYnMoZmlsbCA9ICJIb3VycyBvZiBlbGVjdHJpY2l0eSBwZXIgZGF5IikNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cyAlPiUgZmlsdGVyKENvdW50cnk9PSJJbmRpYSIpICU+JQ0KICAgICAgICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBBZGRfdmVudGlsYXRpb246VXNlX3RhbGN1bV9wb3dkZXIsDQogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiTm9ybWFsbHlEb19OZXciLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJTZWxlY3Rpb24iKSAlPiUNCiAgICAgICAgIGdyb3VwX2J5KE5vcm1hbGx5RG9fTmV3LCBTZWxlY3Rpb24pICU+JQ0KICAgICAgICAgbXV0YXRlKE5vcm1hbGx5RG9fTmV3ID0gYXNfZmFjdG9yKE5vcm1hbGx5RG9fTmV3KSkgJT4lDQogICAgICAgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogICAgICAgICBmaWx0ZXIoU2VsZWN0aW9uID09ICJZZXMiKSAlPiUNCiAgICAgICAgIGFycmFuZ2UoZGVzYyhuKSkpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSByZW9yZGVyKE5vcm1hbGx5RG9fTmV3LCBuKSwgeSA9IG4pLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICIjRTY5RjAwIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIlRha2VfYV9iYXRoX29yX3Nob3dlciIgPSAiVGFrZSBhIGJhdGggb3Igc2hvd2VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb19vdXRzaWRlIiA9ICJHbyBvdXRzaWRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VfZmFuIiA9ICJVc2UgZmFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb19ub3RoaW5nX3NwZWNpZmljIiA9ICJEbyBub3RoaW5nIHNwZWNpZmljIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcmlua19jb2xkX2RyaW5rIiA9ICJEcmluayBjb2xkIGRyaW5rIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VfbWFudWFsX2Zhbl9vcl9jb29saW5nX2RldmljZSIgPSAiVXNlIG1hbnVhbCBmYW4gb3IgY29vbGluZyBkZXZpY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkZF92ZW50aWxhdGlvbiIgPSAiQWRkIHZlbnRpbGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdXJuX29uX3Bvd2VyX3NvdXJjZSIgPSAiVHVybiBvbiBwb3dlciBzb3VyY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRyaW5rX3dhdGVyIiA9ICJEcmluayB3YXRlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlX2FfY29vbGVyIiA9ICJVc2UgYSBjb29sZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFuX2Zsb29yX3dpdGhfd2F0ZXIiID0gIkNsZWFuIGZsb29yIHdpdGggd2F0ZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXlfYXRfaG9tZSIgPSAiU3RheSBhdCBob21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGVlcF9vcl9yZXN0IiA9ICJTbGVlcCBvciByZXN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VfdGFsY3VtX3Bvd2RlciIgPSAiVXNlIHRhbGN1bSBwb3dkZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZV9BQyIgPSAiVXNlIEFDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmRyZXNzX29yX2NoYW5nZV9jbG90aGVzX29yX3dldF9jbG90aGVzIiA9ICJVbmRyZXNzIG9yIGNoYW5nZSBjbG90aGVzIG9yIHdldCBjbG90aGVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcmlua193YXJtX2RyaW5rIiA9ICJEcmluayB3YXJtIGRyaW5rIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXRfdW5kZXJfdHJlZSIgPSAiU2l0IHVuZGVyIHRyZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbnRfZ29fb3V0c2lkZV8oQ09WSURfcmVsYXRlZCkiID0gIkNhbid0IGdvIG91dHNpZGUgKENPVklELXJlbGF0ZWQpIikpICsNCiAgeGxhYigiU3RyYXRlZ2llcyBub3JtYWxseSB1c2VkIHRvIG1hbmFnZSBoZWF0IikgKw0KICBjb29yZF9mbGlwKCkNCg0KIyBQYWdlIDUyDQpuZXduZXh1cyAlPiUgIyBGYW50YXN0aWMgZXhhbXBsZSBmcm9tIFNpbW9uIEJyYXVlciBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzAwODcwNS9nZ3Bsb3QtYmFyLWNoYXJ0LW9mLXBlcmNlbnRhZ2VzLW92ZXItZ3JvdXBzDQogIGZpbHRlcihDb3VudHJ5ID09ICJJbmRpYSIpICU+JQ0KICBncm91cF9ieShTcGVuZEF0SG9tZSwgR2VuZGVyKSAlPiUNCiAgY291bnQoKSAlPiUNCiAgZ3JvdXBfYnkoR2VuZGVyKSAlPiUNCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSBuL3N1bShuKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IFNwZW5kQXRIb21lLCB5ID0gcGVyY2VudGFnZSwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIHhsYWIoIkNoYW5nZSBpbiB0aW1lIGF0IGhvbWUgYWZ0ZXIgcGFuZGVtaWMiKSArDQogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgZ3JvdXAiKQ0KDQoNCiMgUGFnZSA1Mw0KbmV3bmV4dXMgJT4lICMgRmFudGFzdGljIGV4YW1wbGUgZnJvbSBTaW1vbiBCcmF1ZXIgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzcwMDg3MDUvZ2dwbG90LWJhci1jaGFydC1vZi1wZXJjZW50YWdlcy1vdmVyLWdyb3Vwcw0KICBmaWx0ZXIoQ291bnRyeSA9PSAiSW5kaWEiKSAlPiUNCiAgZ3JvdXBfYnkoQW1vdW50T2ZUaW1lLCBHZW5kZXIpICU+JQ0KICBjb3VudCgpICU+JQ0KICBncm91cF9ieShHZW5kZXIpICU+JQ0KICBtdXRhdGUocGVyY2VudGFnZSA9IG4vc3VtKG4pKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQW1vdW50T2ZUaW1lLCB5ID0gcGVyY2VudGFnZSwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIHhsYWIoIkNoYW5nZSBpbiB0aW1lIGF0IGhvbWUgYWZ0ZXIgcGFuZGVtaWMiKSArDQogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgZ3JvdXAiKQ0KDQpgYGANCg0KIyMgSW5kb25lc2lhIA0KDQpgYGB7ciwgY2FjaGUgPSBUUlVFfQ0KDQojIFBhZ2UgNjYNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJJbmRvbmVzaWEiKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IE9jY3VwYXRpb25fQ29kZWQpLCBmaWxsID0gIiM1NkI0RTkiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgeGxhYigiT2NjdXBhdGlvbiIpICsNCiAgeWxhYigibiIpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJJbmRvbmVzaWEiKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEVsZWN0cmljaXR5LCBmaWxsID0gSG91cnNEYXlDYXQpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgeWxhYigibiIpICsNCiAgeGxhYigiU291cmNlIG9mIGVsZWN0cmljaXR5IikgKw0KICBsYWJzKGZpbGwgPSAiSG91cnMgb2YgZWxlY3RyaWNpdHkgcGVyIGRheSIpDQoNCg0KIyBQYWdlIDY3DQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzICU+JSBmaWx0ZXIoQ291bnRyeT09IkluZG9uZXNpYSIpICU+JQ0KICAgICAgICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBBZGRfdmVudGlsYXRpb246VXNlX3RhbGN1bV9wb3dkZXIsDQogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiTm9ybWFsbHlEb19OZXciLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJTZWxlY3Rpb24iKSAlPiUNCiAgICAgICAgIGdyb3VwX2J5KE5vcm1hbGx5RG9fTmV3LCBTZWxlY3Rpb24pICU+JQ0KICAgICAgICAgbXV0YXRlKE5vcm1hbGx5RG9fTmV3ID0gYXNfZmFjdG9yKE5vcm1hbGx5RG9fTmV3KSkgJT4lDQogICAgICAgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogICAgICAgICBmaWx0ZXIoU2VsZWN0aW9uID09ICJZZXMiKSAlPiUNCiAgICAgICAgIGFycmFuZ2UoZGVzYyhuKSkpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSByZW9yZGVyKE5vcm1hbGx5RG9fTmV3LCBuKSwgeSA9IG4pLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICIjNTZCNEU5IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIlVzZV9mYW4iID0gIlVzZSBmYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkZF92ZW50aWxhdGlvbiIgPSAiQWRkIHZlbnRpbGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb19vdXRzaWRlIiA9ICJHbyBvdXRzaWRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYWtlX2FfYmF0aF9vcl9zaG93ZXIiID0gIlRha2UgYSBiYXRoIG9yIHNob3dlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kcmVzc19vcl9jaGFuZ2VfY2xvdGhlc19vcl93ZXRfY2xvdGhlcyIgPSAiVW5kcmVzcyBvciBjaGFuZ2UgY2xvdGhlcyBvciB3ZXQgY2xvdGhlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlX0FDIiA9ICJVc2UgQUMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZV9tYW51YWxfZmFuX29yX2Nvb2xpbmdfZGV2aWNlIiA9ICJVc2UgbWFudWFsIGZhbiBvciBjb29saW5nIGRldmljZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHJpbmtfd2F0ZXIiID0gIkRyaW5rIHdhdGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGVlcF9vcl9saWVfb25fZmxvb3IiID0gIlNsZWVwIG9yIGxpZSBvbiBmbG9vciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l0X3VuZGVyX3RyZWUiID0gIlNpdCB1bmRlciB0cmVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdXJuX29mZl9saWdodHMiID0gIlR1cm4gb2ZmIGxpZ2h0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xlZXBfb3JfcmVzdCIgPSAiU2xlZXAgb3IgcmVzdCIpKSArDQogIHhsYWIoIlN0cmF0ZWdpZXMgbm9ybWFsbHkgdXNlZCB0byBtYW5hZ2UgaGVhdCIpICsNCiAgY29vcmRfZmxpcCgpDQoNCiMgUGFnZSA2OA0KbmV3bmV4dXMgJT4lICMgRmFudGFzdGljIGV4YW1wbGUgZnJvbSBTaW1vbiBCcmF1ZXIgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzcwMDg3MDUvZ2dwbG90LWJhci1jaGFydC1vZi1wZXJjZW50YWdlcy1vdmVyLWdyb3Vwcw0KICBmaWx0ZXIoQ291bnRyeSA9PSAiSW5kb25lc2lhIikgJT4lDQogIGdyb3VwX2J5KFNwZW5kQXRIb21lLCBHZW5kZXIpICU+JQ0KICBjb3VudCgpICU+JQ0KICBncm91cF9ieShHZW5kZXIpICU+JQ0KICBtdXRhdGUocGVyY2VudGFnZSA9IG4vc3VtKG4pKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gU3BlbmRBdEhvbWUsIHkgPSBwZXJjZW50YWdlLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgeGxhYigiVGltZSBzcGVudCBhdCBob21lIGJlZm9yZSBwYW5kZW1pYyIpICsNCiAgeWxhYigiUGVyY2VudGFnZSBvZiBncm91cCIpDQoNCm5ld25leHVzICU+JSAjIEZhbnRhc3RpYyBleGFtcGxlIGZyb20gU2ltb24gQnJhdWVyIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3MDA4NzA1L2dncGxvdC1iYXItY2hhcnQtb2YtcGVyY2VudGFnZXMtb3Zlci1ncm91cHMNCiAgZmlsdGVyKENvdW50cnkgPT0gIkluZG9uZXNpYSIpICU+JQ0KICBncm91cF9ieShBbW91bnRPZlRpbWUsIEdlbmRlcikgJT4lDQogIGNvdW50KCkgJT4lDQogIGdyb3VwX2J5KEdlbmRlcikgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbi9zdW0obikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBbW91bnRPZlRpbWUsIHkgPSBwZXJjZW50YWdlLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgeGxhYigiQ2hhbmdlIGluIHRpbWUgc3BlbnQgYXQgaG9tZSBhZnRlciBwYW5kZW1pYyIpICsNCiAgeWxhYigiUGVyY2VudGFnZSBvZiBncm91cCIpDQoNCiMgUGFnZSA3NA0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cyAlPiUgZmlsdGVyKENvdW50cnk9PSJJbmRvbmVzaWEiKSAlPiUNCiAgICAgICAgIGdyb3VwX2J5KFllc1BhbmRlbWljQ2hhbmdlX1JlY29kZWQpICU+JQ0KICAgICAgICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICAgICAgICAgZmlsdGVyKFllc1BhbmRlbWljQ2hhbmdlX1JlY29kZWQgIT0gIk4vQSIpICU+JQ0KICAgICAgICAgYXJyYW5nZSgtbikpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSByZW9yZGVyKFllc1BhbmRlbWljQ2hhbmdlX1JlY29kZWQsIG4pLCB5ID0gbiksIHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gIiM1NkI0RTkiKSArDQogIHhsYWIoIlN0cmF0ZWdpZXMgdG8gbWFuYWdlIGhlYXQgZHVyaW5nIHBhbmRlbWljIikgKw0KICBjb29yZF9mbGlwKCkNCg0KDQpgYGANCg0KIyMgQ2FtZXJvb24NCg0KYGBge3IsIGNhY2hlID0gVFJVRX0NCiMgUGFnZSA4Mg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cyAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkNhbWVyb29uIikpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBPY2N1cGF0aW9uX0NvZGVkKSwgZmlsbCA9ICIjMDA5RTczIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHhsYWIoIk9jY3VwYXRpb24iKSArDQogIHlsYWIoIm4iKQ0KICANCm5ld25leHVzICU+JSAjIEZhbnRhc3RpYyBleGFtcGxlIGZyb20gU2ltb24gQnJhdWVyIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3MDA4NzA1L2dncGxvdC1iYXItY2hhcnQtb2YtcGVyY2VudGFnZXMtb3Zlci1ncm91cHMNCiAgZmlsdGVyKENvdW50cnkgPT0gIkNhbWVyb29uIikgJT4lDQogIGdyb3VwX2J5KE9jY3VwYXRpb25fQ29kZWQsIEdlbmRlcikgJT4lDQogIGNvdW50KCkgJT4lDQogIGdyb3VwX2J5KEdlbmRlcikgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbi9zdW0obikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBPY2N1cGF0aW9uX0NvZGVkLCB5ID0gcGVyY2VudGFnZSwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIHhsYWIoIk9jY3VwYXRpb24iKSArDQogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgZ3JvdXAiKQ0KDQojIFBhZ2UgODQNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5PT0iQ2FtZXJvb24iKSAlPiUNCiAgICAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gQWRkX3ZlbnRpbGF0aW9uOlVzZV90YWxjdW1fcG93ZGVyLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIk5vcm1hbGx5RG9fTmV3IiwNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiU2VsZWN0aW9uIikgJT4lDQogICAgICAgICBncm91cF9ieShOb3JtYWxseURvX05ldywgU2VsZWN0aW9uKSAlPiUNCiAgICAgICAgIG11dGF0ZShOb3JtYWxseURvX05ldyA9IGFzX2ZhY3RvcihOb3JtYWxseURvX05ldykpICU+JQ0KICAgICAgICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICAgICAgICAgZmlsdGVyKFNlbGVjdGlvbiA9PSAiWWVzIikgJT4lDQogICAgICAgICBhcnJhbmdlKGRlc2MobikpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gcmVvcmRlcihOb3JtYWxseURvX05ldywgbiksIHkgPSBuKSwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiIzAwOUU3MyIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJUYWtlX2FfYmF0aF9vcl9zaG93ZXIiID0gIlRha2UgYSBiYXRoIG9yIHNob3dlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR29fb3V0c2lkZSIgPSAiR28gb3V0c2lkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlX2ZhbiIgPSAiVXNlIGZhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9fbm90aGluZ19zcGVjaWZpYyIgPSAiRG8gbm90aGluZyBzcGVjaWZpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHJpbmtfY29sZF9kcmluayIgPSAiRHJpbmsgY29sZCBkcmluayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlX21hbnVhbF9mYW5fb3JfY29vbGluZ19kZXZpY2UiID0gIlVzZSBtYW51YWwgZmFuIG9yIGNvb2xpbmcgZGV2aWNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZGRfdmVudGlsYXRpb24iID0gIkFkZCB2ZW50aWxhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHVybl9vbl9wb3dlcl9zb3VyY2UiID0gIlR1cm4gb24gcG93ZXIgc291cmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcmlua193YXRlciIgPSAiRHJpbmsgd2F0ZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZV9hX2Nvb2xlciIgPSAiVXNlIGEgY29vbGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGVhbl9mbG9vcl93aXRoX3dhdGVyIiA9ICJDbGVhbiBmbG9vciB3aXRoIHdhdGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF5X2F0X2hvbWUiID0gIlN0YXkgYXQgaG9tZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xlZXBfb3JfcmVzdCIgPSAiU2xlZXAgb3IgcmVzdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlX3RhbGN1bV9wb3dkZXIiID0gIlVzZSB0YWxjdW0gcG93ZGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VfQUMiID0gIlVzZSBBQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kcmVzc19vcl9jaGFuZ2VfY2xvdGhlc19vcl93ZXRfY2xvdGhlcyIgPSAiVW5kcmVzcyBvciBjaGFuZ2UgY2xvdGhlcyBvciB3ZXQgY2xvdGhlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHJpbmtfd2FybV9kcmluayIgPSAiRHJpbmsgd2FybSBkcmluayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l0X3VuZGVyX3RyZWUiID0gIlNpdCB1bmRlciB0cmVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW50X2dvX291dHNpZGVfKENPVklEX3JlbGF0ZWQpIiA9ICJDYW4ndCBnbyBvdXRzaWRlIChDT1ZJRC1yZWxhdGVkKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHJhd19jdXJ0YWlucyIgPSAiRHJhdyBjdXJ0YWlucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xlZXBfb3JfbGllX29uX2Zsb29yIiA9ICJTbGVlcCBvciBsaWUgb24gZmxvb3IiKSkgKw0KICB4bGFiKCJTdHJhdGVnaWVzIG5vcm1hbGx5IHVzZWQgdG8gbWFuYWdlIGhlYXQiKSArDQogIGNvb3JkX2ZsaXAoKQ0KDQojIFBhZ2UgODUNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJDYW1lcm9vbiIpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gRWxlY3RyaWNpdHksIGZpbGwgPSBIb3Vyc0RheUNhdCksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB5bGFiKCJuIikgKw0KICB4bGFiKCJTb3VyY2Ugb2YgZWxlY3RyaWNpdHkiKSArDQogIGxhYnMoZmlsbCA9ICJIb3VycyBvZiBlbGVjdHJpY2l0eSBwZXIgZGF5IikNCg0KIyBQYWdlIDg2DQpuZXduZXh1cyAlPiUgIyBGYW50YXN0aWMgZXhhbXBsZSBmcm9tIFNpbW9uIEJyYXVlciBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzAwODcwNS9nZ3Bsb3QtYmFyLWNoYXJ0LW9mLXBlcmNlbnRhZ2VzLW92ZXItZ3JvdXBzDQogIGZpbHRlcihDb3VudHJ5ID09ICJDYW1lcm9vbiIpICU+JQ0KICBncm91cF9ieShTcGVuZEF0SG9tZSwgR2VuZGVyKSAlPiUNCiAgY291bnQoKSAlPiUNCiAgZ3JvdXBfYnkoR2VuZGVyKSAlPiUNCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSBuL3N1bShuKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IFNwZW5kQXRIb21lLCB5ID0gcGVyY2VudGFnZSwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIHhsYWIoIlRpbWUgc3BlbnQgYXQgaG9tZSBiZWZvcmUgcGFuZGVtaWMiKSArDQogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgZ3JvdXAiKQ0KDQpuZXduZXh1cyAlPiUgIyBGYW50YXN0aWMgZXhhbXBsZSBmcm9tIFNpbW9uIEJyYXVlciBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzAwODcwNS9nZ3Bsb3QtYmFyLWNoYXJ0LW9mLXBlcmNlbnRhZ2VzLW92ZXItZ3JvdXBzDQogIGZpbHRlcihDb3VudHJ5ID09ICJDYW1lcm9vbiIpICU+JQ0KICBncm91cF9ieShBbW91bnRPZlRpbWUsIEdlbmRlcikgJT4lDQogIGNvdW50KCkgJT4lDQogIGdyb3VwX2J5KEdlbmRlcikgJT4lDQogIG11dGF0ZShwZXJjZW50YWdlID0gbi9zdW0obikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBbW91bnRPZlRpbWUsIHkgPSBwZXJjZW50YWdlLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgeGxhYigiQ2hhbmdlIGluIHRpbWUgc3BlbnQgYXQgaG9tZSBhZnRlciBwYW5kZW1pYyIpICsNCiAgeWxhYigiUGVyY2VudGFnZSBvZiBncm91cCIpDQpgYGANCg0KIyMgQWxsIGNvdW50cmllcw0KDQpgYGB7ciwgY2FjaGUgPSBUUlVFfQ0KIyBQYWdlIDk3DQogICAgICAjIE5vIGFnZSBkaXN0cmlidXRpb24gZGF0YSBpbiBteSBkYXRhIHNldHMNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IENvdW50cnksIGZpbGwgPSBHZW5kZXIpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIHlsYWIoIm4iKQ0KDQojIFBhZ2UgOTgNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBPY2N1cGF0aW9uX0NvZGVkLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKw0KICB4bGFiKCJPY2N1cGF0aW9uIikgKw0KICB5bGFiKCJuIikNCg0KIyBQYWdlIDk5DQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gUm9vZmluZ01hdGVyaWFsLCBmaWxsID0gQ291bnRyeSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB2YXJzKENvdW50cnkpLCBuY29sID0gMSkNCg0KIyBQYWdlIDEwMA0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IFdhbGxNYXRlcmlhbCwgZmlsbCA9IENvdW50cnkpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gdmFycyhDb3VudHJ5KSwgbmNvbCA9IDEpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBGbG9vck1hdGVyaWFsLCBmaWxsID0gQ291bnRyeSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB2YXJzKENvdW50cnkpLCBuY29sID0gMSkNCg0KIyBQYWdlIDEwMw0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUsIGZpbGwgPSBDb3VudHJ5KSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IHZhcnMoQ291bnRyeSksIG5jb2wgPSAxKSArDQogIHhsYWIoIlRoZXJtYWwgY29tZm9ydCBvdXRzaWRlIHRoZSBob21lIikNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IFRlbXBlcmF0dXJlSW5zaWRlSG9tZSwgZmlsbCA9IENvdW50cnkpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gdmFycyhDb3VudHJ5KSwgbmNvbCA9IDEpICsNCiAgeGxhYigiVGhlcm1hbCBjb21mb3J0IGluc2lkZSB0aGUgaG9tZSIpDQoNCiMgUGFnZSAxMDUNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBTcGVuZEF0SG9tZSwgZmlsbCA9IENvdW50cnkpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gdmFycyhDb3VudHJ5KSwgbmNvbCA9IDEpICsNCiAgeGxhYigiVGltZSBzcGVudCBhdCBob21lIGJlZm9yZSBwYW5kZW1pYyIpICsNCiAgeWxhYigibiIpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBBbW91bnRPZlRpbWUsIGZpbGwgPSBDb3VudHJ5KSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IHZhcnMoQ291bnRyeSksIG5jb2wgPSAxKSArDQogIHhsYWIoIkNoYW5nZSBpbiB0aW1lIHNwZW50IGF0IGhvbWUgYWZ0ZXIgcGFuZGVtaWMiKSArDQogIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgZ3JvdXAiKQ0KDQojIFBhZ2UgMTA4DQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gSG91cnNEYXksIGZpbGwgPSBDb3VudHJ5KSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB2YXJzKENvdW50cnkpLCBuY29sID0gMSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0LDEpKSArDQogIHhsYWIoIkhvdXJzIG9mIGVsZWN0cmljaXR5IHBlciBkYXkiKSArDQogIHlsYWIoIm4iKQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBUZW1wZXJhdHVyZUluc2lkZUhvbWUsIGZpbGwgPSBUZW1wZXJhdHVyZUluc2lkZUhvbWUpKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ291bnRyeSkpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQsIGZpbGwgPSBUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQpKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ291bnRyeSkpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJQYWtpc3RhbiIpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gV2F0ZXJJbnRha2UpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IFRlbXBlcmF0dXJlLCB5ID0gUmVsYXRpdmVfSHVtaWRpdHksIGNvbG91ciA9IENpdHksIHNpemUgPSBIZWF0X0luZGV4KSkgKw0KICBzY2FsZV9zaXplX2Jpbm5lZChuLmJyZWFrcyA9IDgpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fcG9pbnQoYWVzKHggPSBUZW1wZXJhdHVyZSwgeSA9IFJlbGF0aXZlX0h1bWlkaXR5LCBjb2xvdXIgPSBDb3VudHJ5LCBzaXplID0gSGVhdF9JbmRleCkpICsNCiAgc2NhbGVfc2l6ZV9iaW5uZWQobi5icmVha3MgPSA4KQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKHggPSBUZW1wZXJhdHVyZSwgeSA9IEhvdXJzRGF5LCBjb2xvdXIgPSBDaXR5KSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gUm9vbXMsIGZpbGwgPSBDaXR5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBQZW9wbGVfaW5fSG91c2UsIGZpbGwgPSBDaXR5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBQZW9wbGVfaW5fSG91c2UsIGZpbGwgPSBmYWN0b3IoUm9vbXMpKSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX3hfY29udGludW91cyhuLmJyZWFrcyA9IDIwKQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBQZW9wbGVfaW5fSG91c2UsIGZpbGwgPSBmYWN0b3IoUm9vbXMpKSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ291bnRyeSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG4uYnJlYWtzID0gMjApDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IFRlbXBlcmF0dXJlSW5zaWRlSG9tZSwgZmlsbCA9IFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUpKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSkpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBUZW1wZXJhdHVyZSwgZmlsbCA9IFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUpKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSkpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBUZW1wZXJhdHVyZSwgZmlsbCA9IFRlbXBlcmF0dXJlSW5zaWRlSG9tZSkpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhUZW1wZXJhdHVyZUluc2lkZUhvbWUpKQ0KDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gU3BlbmRBdEhvbWUpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gU3BlbmRBdEhvbWUsIGZpbGwgPSBDaXR5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gU3BlbmRBdEhvbWUsIGZpbGwgPSBDb3VudHJ5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBBbW91bnRPZlRpbWUpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gQW1vdW50T2ZUaW1lLCBmaWxsID0gQ2l0eSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEFtb3VudE9mVGltZSwgZmlsbCA9IENvdW50cnkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEluY29tZSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBJbmNvbWUsIGZpbGwgPSBDaXR5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gSW5jb21lLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gRWF0aW5nSGFiaXRzKSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEVhdGluZ0hhYml0cywgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBFYXRpbmdIYWJpdHMsIGZpbGwgPSBDb3VudHJ5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBXYXRlckludGFrZSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBXYXRlckludGFrZSwgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBXYXRlckludGFrZSwgZmlsbCA9IENvdW50cnkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEVsZWN0cmljaXR5VXNhZ2UpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gRWxlY3RyaWNpdHlVc2FnZSwgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBFbGVjdHJpY2l0eVVzYWdlLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBIZWFsdGhTZXJ2aWNlcykpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBIZWFsdGhTZXJ2aWNlcywgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBIZWFsdGhTZXJ2aWNlcywgZmlsbCA9IENvdW50cnkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEhvbWVXYXJtKSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEhvbWVXYXJtLCBmaWxsID0gQ2l0eSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEhvbWVXYXJtLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IEhvbWVXYXJtKSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ291bnRyeSkpDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBUZW1wZXJhdHVyZUluc2lkZUhvbWUpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gVGVtcGVyYXR1cmVJbnNpZGVIb21lLCBmaWxsID0gQ2l0eSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IFRlbXBlcmF0dXJlSW5zaWRlSG9tZSwgZmlsbCA9IENvdW50cnkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSwgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBUZW1wZXJhdHVyZU91dHNpZGVIb21lLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IFdhbGxNYXRlcmlhbCkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IFdhbGxNYXRlcmlhbCkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgKw0KICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKENvdW50cnkpKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gd2FsbG1hc3MpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDb3VudHJ5KSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGx0aGVybSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgKw0KICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKENvdW50cnkpKQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBSb29maW5nTWF0ZXJpYWwpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBSb29maW5nTWF0ZXJpYWwpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDb3VudHJ5KSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJvb2ZtYXNzKSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ291bnRyeSkpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSByb29mdGhlcm0pKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDb3VudHJ5KSkNCg0KDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGxtYXNzLCBmaWxsID0gQ2l0eSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gd2FsbG1hc3MsIGZpbGwgPSBDb3VudHJ5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gcm9vZm1hc3MpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSByb29mbWFzcywgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJvb2ZtYXNzLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGx0aGVybSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGx0aGVybSwgZmlsbCA9IENpdHkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGx0aGVybSwgZmlsbCA9IENvdW50cnkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gcm9vZnRoZXJtKSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gcm9vZnRoZXJtLCBmaWxsID0gQ2l0eSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gcm9vZnRoZXJtLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IFRlbXBlcmF0dXJlLCBmaWxsID0gcm9vZnRoZXJtKSkgKw0KICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKENvdW50cnkpKQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBXaW5kb3dzLCBmaWxsID0gcm9vZnRoZXJtKSkgKw0KICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKENvdW50cnkpKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gV2luZG93cywgZmlsbCA9IHdhbGx0aGVybSkpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDb3VudHJ5KSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzICU+JSBmaWx0ZXIoVGVtcGVyYXR1cmVJbnNpZGVIb21lIT0iZG9uJ3Qga25vdyImVGVtcGVyYXR1cmVJbnNpZGVIb21lIT0icmVmdXNlZCIpKSArDQogIGdlb21fYmFyKGFlcyh4ID0gV2luZG93cywgZmlsbCA9IFRlbXBlcmF0dXJlSW5zaWRlSG9tZSkpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDb3VudHJ5KSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cyAlPiUgZmlsdGVyKFRlbXBlcmF0dXJlSW5zaWRlSG9tZSE9ImRvbid0IGtub3ciJlRlbXBlcmF0dXJlSW5zaWRlSG9tZSE9InJlZnVzZWQiKSkgKw0KICBnZW9tX2JhcihhZXMoeCA9IFJvb21zLCBmaWxsID0gVGVtcGVyYXR1cmVJbnNpZGVIb21lKSkgKw0KICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKENvdW50cnkpKQ0KDQoNCmdncGxvdChkYXRhID0gbmV3bmV4dXMgJT4lIGZpbHRlcihUZW1wZXJhdHVyZUluc2lkZUhvbWUhPSJkb24ndCBrbm93IiZUZW1wZXJhdHVyZUluc2lkZUhvbWUhPSJyZWZ1c2VkIikpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBXaW5kb3dzLCBmaWxsID0gQ291bnRyeSksIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKFRlbXBlcmF0dXJlSW5zaWRlSG9tZSkpDQoNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGxtYXNzLCBmaWxsID0gcm9vZm1hc3MpKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gd2FsbG1hc3MsIGZpbGwgPSByb29mbWFzcykpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDb3VudHJ5KSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGx0aGVybSwgZmlsbCA9IHJvb2Z0aGVybSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHdhbGx0aGVybSwgZmlsbCA9IHJvb2Z0aGVybSkpICsNCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDb3VudHJ5KSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTApKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpnZ3Bsb3QoZGF0YSA9IG5leHVzZGF0YSkgKw0KICBnZW9tX3Zpb2xpbihhZXMoeCA9IENpdHksIHkgPSBIb3Vyc0RheSkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gSG91cnNEYXksIGZpbGwgPSBDaXR5KSwgYmlud2lkdGggPSAyKSArDQogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhDaXR5KSkNCg0KZ2dwbG90KGRhdGEgPSBuZXh1c2RhdGEpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBQZW9wbGVfaW5fSG91c2UsIGZpbGwgPSBDaXR5KSwgYmlud2lkdGggPSAyKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ2l0eSkpDQoNCmdncGxvdChkYXRhID0gbmV4dXNkYXRhKSArDQogIGdlb21fYmFyKGFlcyh4ID0gV2luZG93cywgZmlsbCA9IENpdHkpKSArDQogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoQ2l0eSkpDQoNCg0KYGBgDQoNCg0KDQojIFRhYmxlIDEgY3JlYXRpb24gDQoNCiMjIENoYXJhY3RlcmlzdGljcyBvZiB0aGUgcG9wdWxhdGlvbg0KDQpgYGB7ciwgY2FjaGUgPSBUUlVFfQ0KbGlicmFyeSh0YWJsZTEpDQpuZXh1c2RhdGEyPC1uZXh1c2RhdGENCmZhY19jb2xzIDwtIHNhcHBseShuZXh1c2RhdGEsIGlzLmNoYXJhY3RlcikgICAgIA0KbmV4dXNkYXRhMltmYWNfY29sc10gPC0gbGFwcGx5KG5leHVzZGF0YTJbZmFjX2NvbHNdLCBhcy5mYWN0b3IpDQoNCiNVc2UgdGhlIHRhYmxlMSBjb21tYW5kIHRvIHByb2R1Y2UgYSB0YWJsZSAxDQp0MTwtdGFibGUxKH4gR2VuZGVyICsgT2NjdXBhdGlvbl9Db2RlZCArIExhbmd1YWdlIHwgQ291bnRyeSwgbmV4dXNkYXRhMikNCnQxDQoNCmBgYA0KDQoNCg0KIyMgSG91c2luZyBtYXRlcmlhbHMgYW5kIHdpbmRvd3MNCg0KYGBge3IsIGNhY2hlID0gVFJVRX0NCg0KdDI8LXRhYmxlMSh+IHdhbGxtYXNzICsgcm9vZm1hc3MgKyB3YWxsdGhlcm0gKyByb29mdGhlcm0gKyBXaW5kb3dzIHwgQ291bnRyeSwgZGF0YSA9IG5ld25leHVzKQ0KdDINCmBgYA0KDQoNCg0KIyBSZWdyZXNzaW9uIGFuYWx5c2lzIA0KDQojIyBXYWxsVGhlcm0gey50YWJzZXR9DQoNCiMjIyBQYWtpc3Rhbg0KDQpTdGFuZGFyZCBtb2RlbA0KDQpgYGB7ciwgbWVzc2FnZT0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoanRvb2xzKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCm5ld25leHVzPC1maWx0ZXIobmV3bmV4dXMsIHdhbGx0aGVybSAhPSAiRG9uJ3Qga25vdyIpICU+JSANCiAgZmlsdGVyKHdhbGx0aGVybSAhPSAiUmVmdXNlZCIpICU+JQ0KICBmaWx0ZXIocm9vZnRoZXJtICE9ICJSZWZ1c2VkIikgJT4lIA0KICBmaWx0ZXIocm9vZnRoZXJtICE9ICJEb24ndCBrbm93IikgJT4lIA0KICBtdXRhdGUoVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0ID0gcmVjb2RlKFRlbXBlcmF0dXJlSW5zaWRlSG9tZSwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnkgaG90IiA9ICJIb3QiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG90IiA9ICJIb3QiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybSIgPSAiSG90IiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsaWdodGx5IHdhcm0iID0gIkhvdCIsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21mb3J0YWJsZSIgPSAiQ29sZCIsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGlnaHRseSBjb29sIiA9ICJDb2xkIiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvb2wiID0gIkNvbGQiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29sZCIgPSAgIkNvbGQiKSkgDQoNCm5ld25leHVzJFRlbXBlcmF0dXJlSW5zaWRlSG9tZSA8LSByZWxldmVsKG5ld25leHVzJFRlbXBlcmF0dXJlSW5zaWRlSG9tZSwgcmVmID0gIkNvbGQiKQ0KDQpuZXduZXh1czwtbmV3bmV4dXMgJT4lIA0KICBmaWx0ZXIoVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0ICE9ICJEb24ndCBrbm93IikgJT4lIA0KICBmaWx0ZXIoVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0ICE9ICJSZWZ1c2VkIikgDQoNCnVuaXF1ZShuZXduZXh1cyRUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQpDQpzdW1tYXJ5KG5ld25leHVzJFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCkNCg0KbmV3bmV4dXMgPC0gbXV0YXRlKG5ld25leHVzLCBOb3JtYWxseURvX0NvZGVkID0gcmVjb2RlKE5vcm1hbGx5RG9fQ29kZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEbyBub3RoaW5nIHNwZWNpZmljIiA9ICJEbyBub3RoaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvIG91dHNpZGUgKyBTaXQgdW5kZXIgdHJlZSIgPSAiR28gb3V0c2lkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmNsZWFyIiA9ICJEbyBub3RoaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSBtYW51YWwgZmFuL2Nvb2xpbmcgZGV2aWNlIiA9ICJVc2UgZmFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSBjb29sZXIiID0gIkFkZCB2ZW50aWxhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcmluayBjb2xkIGRyaW5rIiA9ICJEcmluayBzb21ldGhpbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHJpbmsgd2F0ZXIiID0gIkRyaW5rIHNvbWV0aGluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmRyZXNzIiA9ICJPdGhlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHbyBvdXRzaWRlICsgVXNlIGZhbiIgPSAiVXNlIGZhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRkIHZlbnRpbGF0aW9uICsgR28gb3V0c2lkZSIgPSAiQWRkIHZlbnRpbGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRha2UgYmF0aC9zaG93ZXIgKyBVc2UgZmFuIiA9ICJVc2UgZmFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRha2UgYmF0aC9zaG93ZXIgKyBHbyBvdXRzaWRlIiA9ICJHbyBvdXRzaWRlIg0KICApKQ0KDQpuZXduZXh1czwtZmlsdGVyKG5ld25leHVzLCBOb3JtYWxseURvX0NvZGVkID09ICJEbyBub3RoaW5nIiB8IE5vcm1hbGx5RG9fQ29kZWQgPT0gIkdvIG91dHNpZGUiIHwgTm9ybWFsbHlEb19Db2RlZCA9PSAiVXNlIGZhbiIgfCBOb3JtYWxseURvX0NvZGVkID09IkFkZCB2ZW50aWxhdGlvbiJ8IE5vcm1hbGx5RG9fQ29kZWQgPT0iRHJpbmsgc29tZXRoaW5nIiB8IE5vcm1hbGx5RG9fQ29kZWQgPT0iVGFrZSBiYXRoL3Nob3dlciIpDQoNCm5ld25leHVzPC1uZXduZXh1cyAlPiUgDQogIG11dGF0ZShmbG9vcnRoZXJtID0gcmVjb2RlKEZsb29yTWF0ZXJpYWwsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBU1BIQUxURUQgRkxPT1IiID0gIkhlYXZ5d2VpZ2h0IGhpZ2ggdGhlcm1hbCBjb25kdWN0aXZpdHkiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0VNRU5UIiA9ICJIZWF2eXdlaWdodCBoaWdoIHRoZXJtYWwgY29uZHVjdGl2aXR5IiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNFUkFNSUMgVElMRVMiID0gIkhlYXZ5d2VpZ2h0IGxvdyB0aGVybWFsIGNvbmR1Y3Rpdml0eSIsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDTEFZIENPVVJUIiA9ICJIZWF2eXdlaWdodCBsb3cgdGhlcm1hbCBjb25kdWN0aXZpdHkiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1RIRVIiID0gIk90aGVyIiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNBTkQvRElSVCIgPSAiTGlnaHR3ZWlnaHQgbG93IHRoZXJtYWwgY29uZHVjdGl2aXR5IiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldPT0QvQkFNQk9PIiA9ICJMaWdodHdlaWdodCBsb3cgdGhlcm1hbCBjb25kdWN0aXZpdHkiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xBWSBDT0FUIiA9ICAiSGVhdnl3ZWlnaHQgbG93IHRoZXJtYWwgY29uZHVjdGl2aXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRPTidUIEtOT1ciID0gIk90aGVyIikpDQoNCnRlc3Q8LSBuZXduZXh1cyAlPiUgDQogIGdyb3VwX2J5KE5vcm1hbGx5RG9fQ29kZWQpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGFycmFuZ2UoLW4pDQoNCmthYmxlKHRlc3QpDQoNClBha2lzdGFuTW9kZWw8LWZpbHRlcihuZXduZXh1cywgQ291bnRyeSA9PSAiUGFraXN0YW4iKQ0KDQpNb2RlbDEgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IHdhbGx0aGVybSwgZGF0YSA9IFBha2lzdGFuTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsMSkNCmBgYA0KDQpTdGFuZGFyZCBtb2RlbCArIGNvb2xpbmcgcHJhY3RpY2VzICsgdGVtcGVyYXR1cmUgb3V0c2lkZSBob21lICsgV2luZG93cyArIEVsZWN0cmljaXR5ICsgV2F0ZXINCg0KYGBge3J9DQoNCk1vZGVsNSA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gd2FsbHRoZXJtICArIFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUgKyBFbGVjdHJpY2l0eSArIERyaW5raW5nV2F0ZXIgKyBHZW5kZXIgDQosIGRhdGEgPSBQYWtpc3Rhbk1vZGVsLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbShNb2RlbDUpDQoNCmBgYA0KDQojIyMgSW5kaWENCg0KU3RhbmRhcmQgbW9kZWwNCg0KYGBge3J9DQoNCkluZGlhTW9kZWw8LWZpbHRlcihuZXduZXh1cywgQ291bnRyeSA9PSAiSW5kaWEiKQ0KDQpNb2RlbDIgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IHdhbGx0aGVybSwgZGF0YSA9IEluZGlhTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsMikNCg0KYGBgDQoNClN0YW5kYXJkIG1vZGVsICsgY29vbGluZyBwcmFjdGljZXMgKyB0ZW1wZXJhdHVyZSBvdXRzaWRlIGhvbWUNCg0KYGBge3J9DQoNCk1vZGVsNSA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gd2FsbHRoZXJtICsgTm9ybWFsbHlEb19Db2RlZCArIFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUgKyBEcmlua2luZ1dhdGVyICsgR2VuZGVyICsgU3BlbmRBdEhvbWUgKyBXaW5kb3dzICwgZGF0YSA9IEluZGlhTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsNSkNCg0KYGBgDQoNCiMjIyBJbmRvbmVzaWENCg0KU3RhbmRhcmQgbW9kZWwNCg0KYGBge3J9DQoNCkluZG9uZXNpYU1vZGVsPC1maWx0ZXIobmV3bmV4dXMsIENvdW50cnkgPT0gIkluZG9uZXNpYSIpDQoNCk1vZGVsMyA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gd2FsbHRoZXJtLCBkYXRhID0gSW5kb25lc2lhTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsMykNCg0KYGBgDQoNClN0YW5kYXJkIG1vZGVsICsgY29vbGluZyBwcmFjdGljZXMgKyB0ZW1wZXJhdHVyZSBvdXRzaWRlIGhvbWUNCg0KYGBge3J9DQoNCk1vZGVsNSA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gd2FsbHRoZXJtICsgTm9ybWFsbHlEb19Db2RlZCArIFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUgKyBHZW5kZXIgKyBSb29tcyArIFdpbmRvd3MgLCBkYXRhID0gSW5kb25lc2lhTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsNSkNCg0KYGBgDQoNCiMjIyBDYW1lcm9vbg0KDQpTdGFuZGFyZCBNb2RlbA0KDQpgYGB7cn0NCkNhbWVyb29uTW9kZWw8LWZpbHRlcihuZXduZXh1cywgQ291bnRyeSA9PSAiQ2FtZXJvb24iKQ0KDQpNb2RlbDQgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IHdhbGx0aGVybSwgZGF0YSA9IENhbWVyb29uTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsNCkNCg0KYGBgDQoNClN0YW5kYXJkIG1vZGVsICsgY29vbGluZyBwcmFjdGljZXMgKyB0ZW1wZXJhdHVyZSBvdXRzaWRlIGhvbWUgKyBXaW5kb3dzICsgRWxlY3RyaWNpdHkgKyBXYXRlciArIFRpbWUgYXQgaG9tZQ0KDQpgYGB7cn0NCg0KTW9kZWw1IDwtIGdsbShUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQgfiB3YWxsdGhlcm0gKyBOb3JtYWxseURvX0NvZGVkICsgVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSArIEVsZWN0cmljaXR5ICsgRHJpbmtpbmdXYXRlciArIEdlbmRlciArIFNwZW5kQXRIb21lLCBkYXRhID0gQ2FtZXJvb25Nb2RlbCwgZmFtaWx5ID0gYmlub21pYWwoKSkNCnN1bW0oTW9kZWw1KQ0KDQpgYGANCg0KDQoNCiMjIFJvb2ZUaGVybSB7LnRhYnNldH0NCg0KIyMjIFBha2lzdGFuDQoNClN0YW5kYXJkIG1vZGVsDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGp0b29scykNCg0KbmV3bmV4dXM8LWZpbHRlcihuZXduZXh1cywgd2FsbHRoZXJtICE9ICJEb24ndCBrbm93IikgJT4lIA0KICBmaWx0ZXIod2FsbHRoZXJtICE9ICJSZWZ1c2VkIikgJT4lDQogIGZpbHRlcihyb29mdGhlcm0gIT0gIlJlZnVzZWQiKSAlPiUgDQogIGZpbHRlcihyb29mdGhlcm0gIT0gIkRvbid0IGtub3ciKSAlPiUgDQogIG11dGF0ZShUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQgPSByZWNvZGUoVGVtcGVyYXR1cmVJbnNpZGVIb21lLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyeSBob3QiID0gIkhvdCIsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3QiID0gIkhvdCIsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJtIiA9ICJIb3QiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xpZ2h0bHkgd2FybSIgPSAiSG90IiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbWZvcnRhYmxlIiA9ICJDb2xkIiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsaWdodGx5IGNvb2wiID0gIkNvbGQiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29vbCIgPSAiQ29sZCIsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xkIiA9ICAiQ29sZCIpKSANCm5ld25leHVzJFRlbXBlcmF0dXJlSW5zaWRlSG9tZSA8LSByZWxldmVsKG5ld25leHVzJFRlbXBlcmF0dXJlSW5zaWRlSG9tZSwgcmVmID0gIkNvbGQiKQ0KDQpuZXduZXh1czwtbmV3bmV4dXMgJT4lIA0KICBmaWx0ZXIoVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0ICE9ICJEb24ndCBrbm93IikgJT4lIA0KICBmaWx0ZXIoVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0ICE9ICJSZWZ1c2VkIikgDQoNClBha2lzdGFuTW9kZWw8LWZpbHRlcihuZXduZXh1cywgQ291bnRyeSA9PSAiUGFraXN0YW4iKQ0KDQpNb2RlbDEgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IHJvb2Z0aGVybSwgZGF0YSA9IFBha2lzdGFuTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsMSkNCmBgYA0KDQpTdGFuZGFyZCBtb2RlbCArIDUyOQ0KDQpgYGB7cn0NCg0KTW9kZWwxMCA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gcm9vZnRoZXJtICArIFRlbXBlcmF0dXJlT3V0c2lkZUhvbWUgKyBFbGVjdHJpY2l0eSArIERyaW5raW5nV2F0ZXIgKyBHZW5kZXIgKyBOb3JtYWxseURvX0NvZGVkICsgUGVvcGxlX2luX0hvdXNlIA0KLCBkYXRhID0gUGFraXN0YW5Nb2RlbCwgZmFtaWx5ID0gYmlub21pYWwoKSkNCnN1bW0oTW9kZWwxMCkNCg0KYGBgDQoNCg0KIyMjIEluZGlhDQoNCnN0YW5kYXJkIG1vZGVsDQoNCmBgYHtyfQ0KDQpJbmRpYU1vZGVsPC1maWx0ZXIobmV3bmV4dXMsIENvdW50cnkgPT0gIkluZGlhIikNCg0KTW9kZWwyIDwtIGdsbShUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQgfiByb29mdGhlcm0sIGRhdGEgPSBJbmRpYU1vZGVsLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbShNb2RlbDIpDQoNCmBgYA0KDQpzdGFuZGFyZCBtb2RlbCAgKyAxMDQxDQoNCmBgYHtyfQ0KDQpNb2RlbDExIDwtIGdsbShUZW1wZXJhdHVyZUluc2lkZUhvbWVDYXQgfiByb29mdGhlcm0gICsgVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSArIERyaW5raW5nV2F0ZXIgKyBHZW5kZXIgKyBOb3JtYWxseURvX0NvZGVkICsgU3BlbmRBdEhvbWUNCiwgZGF0YSA9IEluZGlhTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsMTEpDQoNCmBgYA0KDQoNCiMjIyBJbmRvbmVzaWENCg0Kc3RhbmRhcmQgbW9kZWwNCg0KYGBge3J9DQpJbmRvbmVzaWFNb2RlbDwtZmlsdGVyKG5ld25leHVzLCBDb3VudHJ5ID09ICJJbmRvbmVzaWEiKQ0KDQpNb2RlbDMgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IHJvb2Z0aGVybSwgZGF0YSA9IEluZG9uZXNpYU1vZGVsLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbShNb2RlbDMpDQoNCmBgYA0KDQpTdGFuZGFyZCBtb2RlbCArIDExMDINCg0KYGBge3J9DQoNCk1vZGVsMTIgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IHJvb2Z0aGVybSAgKyBUZW1wZXJhdHVyZU91dHNpZGVIb21lICsgRWxlY3RyaWNpdHkgKyBEcmlua2luZ1dhdGVyICsgR2VuZGVyICsgTm9ybWFsbHlEb19Db2RlZCArIFNwZW5kQXRIb21lICsgV2luZG93cyArIFBlb3BsZV9pbl9Ib3VzZSANCiwgZGF0YSA9IEluZG9uZXNpYU1vZGVsLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbShNb2RlbDEyKQ0KDQpgYGANCg0KDQojIyMgQ2FtZXJvb24NCg0Kc3RhbmRhcmQgbW9kZWwgDQoNCmBgYHtyfQ0KQ2FtZXJvb25Nb2RlbDwtZmlsdGVyKG5ld25leHVzLCBDb3VudHJ5ID09ICJDYW1lcm9vbiIpDQoNCk1vZGVsNCA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gcm9vZnRoZXJtLCBkYXRhID0gQ2FtZXJvb25Nb2RlbCwgZmFtaWx5ID0gYmlub21pYWwoKSkNCnN1bW0oTW9kZWw0KQ0KDQpgYGANCg0Kc3RhbmRhcmQgbW9kZWwgKyA5NTANCg0KYGBge3J9DQoNCk1vZGVsMTMgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IHJvb2Z0aGVybSAgKyBUZW1wZXJhdHVyZU91dHNpZGVIb21lICsgR2VuZGVyICsgTm9ybWFsbHlEb19Db2RlZCArIFNwZW5kQXRIb21lICsgV2luZG93cyANCiwgZGF0YSA9IENhbWVyb29uTW9kZWwsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tKE1vZGVsMTMpDQoNCmBgYA0KDQoNCiMjIEZsb29yVGhlcm0gey50YWJzZXR9DQoNCiMjIyBQYWtpc3Rhbg0KYGBge3J9DQoNCk1vZGVsNSA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gZmxvb3J0aGVybSAgKyBUZW1wZXJhdHVyZU91dHNpZGVIb21lICsgRWxlY3RyaWNpdHkgKyBEcmlua2luZ1dhdGVyICsgR2VuZGVyIA0KLCBkYXRhID0gUGFraXN0YW5Nb2RlbCwgZmFtaWx5ID0gYmlub21pYWwoKSkNCnN1bW0oTW9kZWw1KQ0KDQoNCmBgYA0KDQojIyMgSW5kaWENClN0YW5kYXJkIG1vZGVsICsgY29vbGluZyBwcmFjdGljZXMgKyB0ZW1wZXJhdHVyZSBvdXRzaWRlIGhvbWUNCg0KYGBge3J9DQoNCk1vZGVsNSA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gZmxvb3J0aGVybSArIE5vcm1hbGx5RG9fQ29kZWQgKyBUZW1wZXJhdHVyZU91dHNpZGVIb21lICsgRHJpbmtpbmdXYXRlciArIEdlbmRlciArIFNwZW5kQXRIb21lICsgV2luZG93cyAsIGRhdGEgPSBJbmRpYU1vZGVsLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbShNb2RlbDUpDQoNCmBgYA0KDQojIyMgSW5kb25lc2lhDQoNClN0YW5kYXJkIG1vZGVsICsgY29vbGluZyBwcmFjdGljZXMgKyB0ZW1wZXJhdHVyZSBvdXRzaWRlIGhvbWUNCg0KYGBge3J9DQoNCk1vZGVsNSA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gZmxvb3J0aGVybSArIE5vcm1hbGx5RG9fQ29kZWQgKyBUZW1wZXJhdHVyZU91dHNpZGVIb21lICsgR2VuZGVyICsgUm9vbXMgKyBXaW5kb3dzICwgZGF0YSA9IEluZG9uZXNpYU1vZGVsLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbShNb2RlbDUpDQoNCmBgYA0KDQojIyMgQ2FtZXJvb24NCg0KU3RhbmRhcmQgbW9kZWwgKyBjb29saW5nIHByYWN0aWNlcyArIHRlbXBlcmF0dXJlIG91dHNpZGUgaG9tZSArIFdpbmRvd3MgKyBFbGVjdHJpY2l0eSArIFdhdGVyICsgVGltZSBhdCBob21lDQoNCmBgYHtyfQ0KDQpNb2RlbDUgPC0gZ2xtKFRlbXBlcmF0dXJlSW5zaWRlSG9tZUNhdCB+IGZsb29ydGhlcm0gKyBOb3JtYWxseURvX0NvZGVkICsgVGVtcGVyYXR1cmVPdXRzaWRlSG9tZSArIEVsZWN0cmljaXR5ICsgRHJpbmtpbmdXYXRlciArIEdlbmRlciArIFNwZW5kQXRIb21lLCBkYXRhID0gQ2FtZXJvb25Nb2RlbCwgZmFtaWx5ID0gYmlub21pYWwoKSkNCnN1bW0oTW9kZWw1KQ0KDQpgYGANCg0KDQoNCg0KIyBEaWFncmFtIG9mIHZhcmlhYmxlIHJlbGF0aW9uc2hpcHMNCg0KYGBge3IsIG91dC53aWR0aCA9ICIxMDAlIiwgY2FjaGUgPSBUUlVFfQ0KbGlicmFyeShrbml0cikNCmluY2x1ZGVfZ3JhcGhpY3MoIlZhcmlhYmxlX2RpYWdyYW0ucG5nIikNCmBgYA0KDQoNCg0KIyBUZXN0aW5nDQpgYGB7cn0NCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkocnN0YXRpeCkNCg0KZ2dwbG90KGRhdGEgPSBuZXduZXh1cykgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJvb2Z0aGVybSwgZmlsbCA9IENvdW50cnkpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gdmFycyhDb3VudHJ5KSwgbmNvbCA9IDEpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAwLjc1KSkNCg0KbmV3bmV4dXMgJT4lIA0KICBncm91cF9ieShDb3VudHJ5LCByb29mdGhlcm0pICU+JSANCiAgY291bnQoKQ0KDQojIFBhZ2UgMTAwDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gd2FsbHRoZXJtLCBmaWxsID0gQ291bnRyeSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB2YXJzKENvdW50cnkpLCBuY29sID0gMSkNCg0KbmV3bmV4dXMgJT4lIA0KICBncm91cF9ieShDb3VudHJ5LCB3YWxsdGhlcm0pICU+JSANCiAgY291bnQoKQ0KDQpuZXduZXh1czwtIGZpbHRlcihuZXduZXh1cywgZmxvb3J0aGVybSAhPSAiT3RoZXIiKQ0KDQpnZ3Bsb3QoZGF0YSA9IG5ld25leHVzKSArDQogIGdlb21fYmFyKGFlcyh4ID0gZmxvb3J0aGVybSwgZmlsbCA9IENvdW50cnkpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gdmFycyhDb3VudHJ5KSwgbmNvbCA9IDEpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAwLjc1KSkNCg0KbmV3bmV4dXMgJT4lIA0KICBncm91cF9ieShDb3VudHJ5LCBmbG9vcnRoZXJtKSAlPiUgDQogIGNvdW50KCkNCg0KY3JhbWVyX3YobmV3bmV4dXMkd2FsbHRoZXJtLCBuZXduZXh1cyRyb29mdGhlcm0pDQoNCk1vZGVsNSA8LSBnbG0oVGVtcGVyYXR1cmVJbnNpZGVIb21lQ2F0IH4gVGVtcGVyYXR1cmUsIGRhdGEgPSBuZXduZXh1cywgZmFtaWx5ID0gYmlub21pYWwoKSkNCnN1bW0oTW9kZWw1KQ0KYGBgDQoNCg==